Spring + жизненный цикл сеанса Hibernate

Как правильно выполнить "жизненный цикл" сеанса Hibernate под Spring?

SessionFactory создается автоматически с помощью Spring и берет свои подключения к БД из пула соединений Glassfish. На данный момент я получаю сеанс Hibernate через SessionFactory.getCurrentSession(). Затем я начинаю транзакцию, выполняю работу, а затем commit() или rollback() в конце. Нужно ли мне делать какие-либо другие действия, такие как disconnect(), close(), flush() или любые другие в любое время, чтобы соединения были правильно возвращены в пул или все уже сделано автоматически с помощью Spring?

С большим количеством этих методов мне сейчас немного смущает понять, что делать, может быть, кто-то может указать на правильное направление?

Ответы

Ответ 1

Поскольку SessionFactory создается автоматически с помощью Spring, Spring framework позаботится о закрытии соединения. Проверьте Spring Управление ресурсами

Если вы хотите проверить. Вы можете проверить журнал, если вы используете ведение журнала для своего приложения. Это будет выглядеть так:

(main) INFO [AnnotationSessionFactoryBean] Закрытие спящего режима SessionFactory

Я получаю следующие строки из эта ссылка

Основной контракт здесь - создание экземпляров сеанса. Как правило приложение имеет один экземпляр SessionFactory и потоки клиентские запросы обслуживания получают экземпляры сеанса из этого factory. Внутреннее состояние SessionFactory является неизменным. Когда это создано это внутреннее состояние. Это внутреннее состояние включает все метаданных об объектно-реляционном сопоставлении. Разработчики должны быть потокобезопасными.

Ответ 2

Политики о том, как соединение возвращается в пул соединений, не имеют ничего общего с Spring. Он настроен самим Hibernate через параметр конфигурации hibernate.connection.release_mode, который идентифицируется перечислением в org.hibernate.ConnectionReleaseMode

Начните с версии 3.1+, значение по умолчанию hibernate.connection.release_mode равно auto, значение которого соответствует ConnectionReleaseMode, зависит от того, используется ли транзакция JTA или JDBC. В случае транзакции JDBC используется значение ConnectionReleaseMode.AFTER_TRANSACTION (i.e after_transaction).

Поведение ConnectionReleaseMode.AFTER_TRANSACTION заключается в следующем: соединение будет возвращено в пул соединений после каждой транзакции, то есть путем вызова либо transaction.commit(), либо transaction.rollback(), а также вызова session.close() и session.disconnect()

Вы можете проверить это поведение в документации hibernate раздела 11.5.

Ответ 3

Когда вы выполняете спящий запрос через SessionFactory.getCurrentSession(), Spring выполняет необходимую задачу по открытию и закрытию соединения. SessionFactory, который вы используете в config Spring, также вызывает внутренний метод config.buildSessionFactory.

Большая часть этого происходит в реализациях AbstractSessionFactoryBean. Закрытие соединения выполняется спящим режимом в классе SessionFactoryImpl с использованием инструкции settings.getConnectionProvider(). Close();, Короче говоря, спящий режим делает все для вас. Spring просто вызывает его при необходимости.

Ответ 4

Надежда эта ссылка поможет вам узнать о сеансе и транзакциях.

Затем я начинаю транзакцию, выполняю работу, а затем совершаю() или откаты() в конце. Нужно ли делать какие-либо другие действия, такие как disconnect(), close(), flush() или любые другие в любое время, так что соединения будут правильно вернулся в пул или уже все автоматически выполняется Spring?

По мере того как вы вызываете commit() в транзакции, он автоматически закрывает сеанс, который в конечном итоге вызывает метод close on connection для возврата в пул.