Задать вопрос
DennisKingsman
@DennisKingsman
Студент

Как освобождать Connection в Hibernate?

Здравствуйте, после нескольких запросов в приложении я столкнулся с таким исключением
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30002ms.

я не настраивал пул коннектов, моей задачей было использовать в Spring приложении обычный Hibernate, для этого я из EntityManager каждый раз вынимал Session и работал с ней, как это делается в обычном hibernate. За пул коннектов, на сколько я понял, отвечает dataSource, а это штука уже по части JDBC. Каким образом мне в моем приложении не переполнять пул коннектов или освобождать его используя средства Hibernate

Мои Dao имплементации выглядят примерно так :
@Component
public class GrowBoxDaoImpl implements GrowBoxDao {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Override
    public List<GrowBox> findByUser(Long userId) {

        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        String hqlQuery = "from GrowBox gb where gb.responsibleUser.id =: userId";
        Query query = session.createQuery(hqlQuery);
        query.setParameter("userId", userId);
        List growBoxes = query.getResultList();
        session.close();
        return growBoxes;
    }

    @Override
    public GrowBox findById(Long id) {

        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        GrowBox growBox = session.get(GrowBox.class, id);
        session.close();

        return growBox;
    }

    @Override
    public GrowBox saveBox(GrowBox box) {
        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        session.getTransaction().begin();
        session.saveOrUpdate(box);
        session.flush();
        session.getTransaction().commit(); // call flush too
        session.close();
        return box;
    }

    @Override
    public void deleteBox(Long id) {

        String hqlQuery = "delete GrowBox where id =: id";
        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        session.getTransaction().begin();

        session.createQuery(hqlQuery).setParameter("id", id).executeUpdate();
        session.flush();
        session.getTransaction().commit();
        session.close();
    }
}

у меня несколько сущностей, для каждой свой Dao и свой Service, несколько контроллеров в которых эти Сервисы используются
в своем Dao я старался корректно выполнять транзакции и всегда закрывал сессии
вот полный репозиторий проекта, если это поможет https://github.com/DennisKingsman/HibernateWithSpr...

P.S. метод disconnect(); тоже не помогает
  • Вопрос задан
  • 1395 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lexas
предположу, что проблема не в хибернате, а в транзакшн менеджере. транзакции открываются, но не закрываются. session от hibernate тут не при чем.

я бы посоветовал:
а) определить явные границы транзакций
б) подебажить кто открывает и почему не поппдает в закрытии (коммит или роллбак) транзакции
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы