Закрыта ли зимняя сессия весной? - PullRequest
0 голосов
/ 27 мая 2018

Я разработал простое приложение с весенней загрузкой и спящим режимом.Раньше я получал сеансы по sessionfactory.opensession();. Нужно ли закрывать сессию вручную после всего, что было сделано?

Является ли хорошей идеей использовать opensession() вместо getcurrentsession() в веб-приложении с несколькими запросами?

1 Ответ

0 голосов
/ 27 мая 2018

Он должен быть закрыт, когда вы закончите (но это может быть сделано автоматически для вас, как мы увидим).Все зависит от того, как вы получаете сеанс.

Если вы используете sessionFactory.getCurrentSession (), вы получите «текущий сеанс», который связан с жизненным циклом транзакции и будет автоматически очищен и закрыткогда транзакция заканчивается (фиксация или откат).

Если вы решите использовать sessionFactory.openSession (), вам придется самостоятельно управлять сеансом, а также сбрасывать и закрывать его «вручную».

Для получения дополнительной информации вы можете проверить http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-basics-apptx

Ну, для вас есть правка:

SessionFactory.openSession () всегда открывает новый сеанс, который вы должны закрыть, как только вы закончите соперации.SessionFactory.getCurrentSession () возвращает сессию, привязанную к контексту - вам не нужно закрывать это.

Edit2

hibernate.current_session_context_class для потока и затем реализовать что-токак фильтр сервлетов, открывающий сеанс - тогда вы можете получить доступ к этому сеансу в любом другом месте с помощью SessionFactory.getCurrentSession ().

SessionFactory.openSession () всегда открывает новый сеанс, который необходимо закрыть, как только высделано с операциями.SessionFactory.getCurrentSession () возвращает сеанс, связанный с контекстом - вам не нужно закрывать его.

Если вы используете Spring или EJB для управления транзакциями, вы можете настроить их для открытия / закрытия сеансов вместе странзакции.

Никогда не следует использовать один сеанс для веб-приложения - сеанс не является потокобезопасным объектом - не может использоваться несколькими потоками.Вы всегда должны использовать «один сеанс на запрос» или «один сеанс на транзакцию»

...