Как поясняется в этом форуме пост , 1 и 2 связаны между собой . Если вы установите hibernate.current_session_context_class
поток, а затем реализуете что-то вроде фильтра сервлета, который открывает сеанс, вы можете получить доступ к этому сеансу в любом другом месте, используя SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
всегда открывает новый сеанс, который необходимо закрыть после завершения операций. SessionFactory.getCurrentSession()
возвращает сеанс, привязанный к контексту - вам не нужно его закрывать.
Если вы используете Spring или EJB для управления транзакциями, вы можете настроить их для открытия / закрытия сеансов вместе с транзакциями.
Вы никогда не должны использовать one session per web app
- сеанс не является потокобезопасным объектом - не может использоваться несколькими потоками. Вы всегда должны использовать «один сеанс на запрос» или «один сеанс на транзакцию».
openSession()
илиclose()
. Он только звонитgetCurrentSession()
. Я предполагаю , что он устанавливаетcurrent_session_context
вthread
. Теперь я думаю, что понимаюgetCurrentSession()
. Однако я не знаю, когда мне следует использоватьopenSession()
.Sessions
. Не могли бы вы помочь мне с этим на - stackoverflow.com/questions/23351083/… . Спасибо и ченки.Если говорить о SessionFactory.openSession ()
А если говорить о SessionFactory.getCurrentSession ()
источник
getCurrentSession
, он бы использовал тот же сеанс повторно, не так ли?openSession
: Когда вы звонитеSessionFactory.openSession
, он всегда создает новыйSession
объект и передает его вам.Вам необходимо явно очистить и закрыть эти объекты сеанса.
Поскольку объекты сеанса не являются потокобезопасными, вам необходимо создать один объект сеанса для каждого запроса в многопоточной среде и один сеанс для каждого запроса в веб-приложениях.
getCurrentSession
: Когда вы вызываетеSessionFactory.getCurrentSession
, он предоставит вам объект сеанса, который находится в контексте спящего режима и внутренне управляется спящим режимом. Он привязан к области транзакции.Когда вы вызываете
SessionFactory.getCurrentSession
, он создает новый,Session
если он не существует, в противном случае используется тот же сеанс, который находится в текущем контексте гибернации. Он автоматически сбрасывает и закрывает сеанс по завершении транзакции, поэтому вам не нужно делать это извне.Если вы используете спящий режим в однопоточной среде, вы можете использовать его
getCurrentSession
, так как он быстрее по производительности по сравнению с созданием нового сеанса каждый раз.Чтобы использовать метод, вам необходимо добавить следующее свойство в hibernate.cfg.xml
getCurrentSession
:источник
источник
SessionFactory: «Один SessionFactory для каждого приложения для каждой базы данных» (например, если вы используете 3 DataBase в нашем приложении, вам необходимо создать объект sessionFactory для каждой БД, всего вам нужно создать 3 sessionFactorys. Или еще, если у вас есть только одна база данных One sessionfactory достаточно ).
Сессия: «Одна сессия за один цикл запрос-ответ». вы можете открыть сеанс, когда пришел запрос, и вы можете закрыть сеанс после завершения процесса запроса. Примечание: -Не используйте один сеанс для веб-приложения.
источник