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 для возврата в пул.