Hibernate openSession () vs getCurrentSession()
Mam kilka pytań dotyczących używania Hibernate w aplikacji webowej JSP.
Jaka powinna być wartość
hibernate.current_session_context_class
?-
W takim razie, które z poniższych stwierdzeń należy użyć? I dlaczego?
Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession()
Na koniec, która z nich jest lepsza "jedna sesja na aplikację internetową" lub "jedna sesja na żądanie"?
4 answers
Jak wyjaśniono na tym forum post , 1 i 2 są powiązane. Jeśli ustawisz hibernate.current_session_context_class
Na wątek, a następnie zaimplementujesz coś w rodzaju filtra serwleta, który otwiera sesję - wtedy możesz uzyskać dostęp do tej sesji gdziekolwiek indziej, używając SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
zawsze otwiera nową sesję, którą należy zamknąć po zakończeniu operacji. SessionFactory.getCurrentSession()
zwraca sesję związaną z kontekstem - nie musisz tego zamykać.
Jeśli używasz Spring lub EJBs do zarządzania transakcjami, możesz skonfiguruj je tak, aby otwierały / zamykały sesje wraz z transakcjami.
Nigdy nie należy używać one session per web app
- session is not a thread safe object - cannot be shared by multiple threads. Należy zawsze używać "jedna sesja na żądanie "lub"jedna sesja na transakcję"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-17 13:54:57
Jeśli mówimy o SessionFactory.openSession ()
- zawsze tworzy nowy obiekt sesji.
- musisz jawnie spłukać i zamknąć obiekty sesji.
- w środowisku jednowątkowym jest wolniejszy niż getCurrentSession.
- nie trzeba konfigurować żadnej właściwości, aby wywołać tę metodę.
I jeśli mówimy o SessionFactory.getCurrentSession ()
- tworzy nową sesję, jeśli nie istnieje, w przeciwnym razie użyj tej samej sesji, która jest w bieżącym hibernate context.
- nie musisz spłukiwać i zamykać obiektów sesji, zostanie to automatycznie wykonane przez Hibernate wewnętrznie.
- w środowisku jednowątkowym jest szybszy niż openSession.
- musisz skonfigurować dodatkową właściwość. "hibernate.current_session_context_class " wywołanie metody getCurrentSession, w przeciwnym razie spowoduje wyrzucenie wyjątku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-19 16:20:40
openSession
: Kiedy wywołujesz SessionFactory.openSession
, zawsze tworzy on nowy obiekt Session
i daje go tobie.
Musisz jawnie spłukać i zamknąć te obiekty sesji.
Ponieważ obiekty sesji są bezpieczne dla wątku a nie, musisz utworzyć jeden obiekt sesji na żądanie w środowisku wielowątkowym i jedną sesję na żądanie także w aplikacjach internetowych.
getCurrentSession
: wywołanie SessionFactory.getCurrentSession
spowoduje wyświetlenie obiektu sesji, który znajduje się w kontekście hibernate i jest zarządzany przez hibernate wewnętrznie. Jest ona związana z zakresem transakcji.
Wywołanie SessionFactory.getCurrentSession
powoduje utworzenie nowej Session
, Jeśli nie istnieje, w przeciwnym razie użyj tej samej sesji, która znajduje się w bieżącym kontekście hibernacji. Automatycznie spłukuje i zamyka sesję po zakończeniu transakcji, więc nie musisz tego robić zewnętrznie.
Jeśli używasz hibernate w środowisku jednowątkowym, możesz użyć getCurrentSession
, ponieważ jest to szybsze w wydajności w porównaniu do tworzenia nowej sesji za każdym razem.
Musisz dodać następująca właściwość hibernate.cfg.xml aby użyć metody getCurrentSession
:
<session-factory>
<!-- Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 06:31:52
SessionFactory: "jedna sesja na aplikację na bazę danych" ( np., jeśli korzystasz z 3 baz danych w naszej aplikacji, musisz utworzyć obiekt sessionFactory dla każdego DB, całkowicie musisz utworzyć 3 sessionFactorys . albo jeśli masz tylko jedną bazę danych wystarczy jedna sesja ).
Session: "jedna sesja dla jednego cyklu request-response". możesz otworzyć sesję, gdy przyszło żądanie, i możesz zamknąć sesję po zakończeniu procesu żądania. Uwaga: - nie używaj jednej sesji do aplikacji webowej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-22 21:38:35