Hibernate openSession () vs getCurrentSession()

Mam kilka pytań dotyczących używania Hibernate w aplikacji webowej JSP.

  1. Jaka powinna być wartość hibernate.current_session_context_class?

  2. 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()
    
  3. Na koniec, która z nich jest lepsza "jedna sesja na aplikację internetową" lub "jedna sesja na żądanie"?

Author: Luiggi Mendoza, 2011-11-08

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ę"

 127
Author: gkamal,
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.
 21
Author: Ramu Agrawal,
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>
 2
Author: Neeraj Gahlawat,
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.

 -4
Author: swamy,
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