Jak wyjaśniono w tym poście na forum , 1 i 2 są powiązane. Jeśli ustawisz hibernate.current_session_context_class
opcję wątku, a następnie zaimplementujesz coś w rodzaju filtru serwletu, który otwiera sesję - wtedy możesz uzyskać dostęp do tej sesji w dowolnym innym miejscu za pomocą SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
zawsze otwiera nową sesję, którą musisz zamknąć po zakończeniu operacji. SessionFactory.getCurrentSession()
zwraca sesję powiązaną z kontekstem - nie musisz tego zamykać.
Jeśli używasz Spring lub EJB do zarządzania transakcjami, możesz je skonfigurować tak, aby otwierały / zamykały sesje wraz z transakcjami.
Nigdy nie powinieneś używać one session per web app
- sesja nie jest obiektem bezpiecznym dla wątków - nie może być współużytkowana przez wiele wątków. Zawsze powinieneś używać „jednej sesji na żądanie” lub „jednej sesji na transakcję”
openSession()
aniclose()
. On tylko dzwonigetCurrentSession()
. Chyba ustawiacurrent_session_context
sięthread
. Teraz myślę, że rozumiemgetCurrentSession()
. Jednak nie wiem, kiedy powinienem użyćopenSession()
.Sessions
. Czy możesz mi w tym pomóc pod adresem - stackoverflow.com/questions/23351083/… . Dziękuję i chenqui.Jeśli mówimy o SessionFactory.openSession ()
A jeśli mówimy o SessionFactory.getCurrentSession ()
źródło
getCurrentSession
, wykorzystałby ponownie tę samą sesję, prawda?openSession
: Kiedy dzwoniszSessionFactory.openSession
, zawsze tworzy nowySession
obiekt i daje ci go.Musisz jawnie opróżnić i zamknąć te obiekty sesji.
Ponieważ obiekty sesji nie są bezpieczne dla wątków, musisz utworzyć jeden obiekt sesji na żądanie w środowisku wielowątkowym i jedną sesję na żądanie również w aplikacjach internetowych.
getCurrentSession
: Kiedy zadzwoniszSessionFactory.getCurrentSession
, dostarczy ci obiekt sesji, który jest w kontekście hibernacji i wewnętrznie zarządzany przez hibernację. Jest to związane z zakresem transakcji.Kiedy dzwonisz
SessionFactory.getCurrentSession
, tworzy nową,Session
jeśli nie istnieje, w przeciwnym razie użyj tej samej sesji, która jest w bieżącym kontekście hibernacji. Automatycznie opróżnia i zamyka sesję po zakończeniu transakcji, więc nie musisz robić tego zewnętrznie.Jeśli używasz hibernacji w środowisku jednowątkowym, możesz użyć
getCurrentSession
, ponieważ jest szybszy w porównaniu do tworzenia nowej sesji za każdym razem.Aby użyć metody, musisz dodać następującą właściwość do hibernate.cfg.xml
getCurrentSession
:<session-factory> <!-- Put other elements here --> <property name="hibernate.current_session_context_class"> thread </property> </session-factory>
źródło
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Parameter | openSession | getCurrentSession | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Session creation | Always open new session | It opens a new Session if not exists , else use same session which is in current hibernate context. | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Session close | Need to close the session object once all the database operations are done | No need to close the session. Once the session factory is closed, this session object is closed. | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Flush and close | Need to explicity flush and close session objects | No need to flush and close sessions , since it is automatically taken by hibernate internally. | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Performance | In single threaded environment , it is slower than getCurrentSession | In single threaded environment , it is faster than openSession | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+ | Configuration | No need to configure any property to call this method | Need to configure additional property: | | | | <property name=""hibernate.current_session_context_class"">thread</property> | +----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
źródło
SessionFactory: „Jedna SessionFactory na aplikację na DataBase” (np. Jeśli używasz 3 DataBase w naszej aplikacji, musisz utworzyć obiekt sessionFactory na każdą bazę danych, całkowicie musisz utworzyć 3 sessionFactory lub jeśli masz tylko jedną sesję DataBase One wystarczy ).
Sesja: „Jedna sesja na jeden cykl żądanie-odpowiedź”. możesz otworzyć sesję po nadejściu żądania i zamknąć sesję po zakończeniu procesu składania wniosku. Uwaga: -Nie używaj jednej sesji dla aplikacji internetowej.
źródło