Жизненный цикл Spring + Hibernate - PullRequest
17 голосов
/ 04 января 2012

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

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

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

Ответы [ 4 ]

12 голосов
/ 04 января 2012

Поскольку SessionFactory автоматически создается Spring, Spring Framework позаботится о закрытии соединения.Проверьте Spring Resource Management

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

(main) INFO [AnnotationSessionFactoryBean] Закрытие Hibernate SessionFactory

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

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

7 голосов
/ 04 января 2012

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

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

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

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

2 голосов
/ 04 января 2012

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

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

2 голосов
/ 04 января 2012

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

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

Когда вы вызываете commit () для Transaction, он автоматически закрывает сеанс, что в конечном итоге вызывает метод close для соединения для возврата в его пул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...