Hibernate openSession () vs getCurrentSession ()

Ich habe einige Fragen zur Verwendung von Hibernate in der JSP-Webanwendung.

  1. Was sollte der Wert für hibernate.current_session_context_class ?

  2. Welche der folgenden Aussagen sollte dann verwendet werden? Und warum?

      Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
  3. Zuletzt, welche ist besser “eine Sitzung pro Web-App” oder “eine Sitzung pro Anfrage”?

   

Wie in diesem Forum Post erklärt , sind 1 und 2 verwandt. Wenn Sie hibernate.current_session_context_class für den Thread festlegen und dann etwas wie einen Servlet-Filter implementieren, der die Sitzung öffnet, können Sie mit der SessionFactory.getCurrentSession() andere Sitzung SessionFactory.getCurrentSession() .

SessionFactory.openSession() öffnet immer eine neue Sitzung, die Sie schließen müssen, sobald Sie mit den Operationen fertig sind. SessionFactory.getCurrentSession() gibt eine Sitzung zurück, die an einen Kontext gebunden ist – Sie müssen diese nicht schließen.

Wenn Sie Spring oder EJBs zum Verwalten von Transaktionen verwenden, können Sie sie so konfigurieren, dass sie Sitzungen zusammen mit den Transaktionen öffnen / schließen.

Sie sollten niemals one session per web app – die Sitzung ist kein Thread-sicheres Objekt – kann nicht von mehreren Threads gemeinsam genutzt werden. Sie sollten immer “eine Sitzung pro Anfrage” oder “eine Sitzung pro Transaktion” verwenden

Wenn wir über SessionFactory.openSession () sprechen

  • Es erstellt immer ein neues Session-Objekt.
  • Sie müssen Sitzungsobjekte explizit leeren und schließen.
  • In Singlethread-Umgebungen ist es langsamer als getCurrentSession.
  • Sie müssen keine Eigenschaft zum Aufrufen dieser Methode konfigurieren.

Und wenn wir über SessionFactory.getCurrentSession () sprechen

  • Wenn nicht vorhanden, wird eine neue Sitzung erstellt. Verwenden Sie andernfalls dieselbe Sitzung, die sich im aktuellen Hibernate-Kontext befindet.
  • Sie müssen Sitzungsobjekte nicht löschen und schließen, da dies intern von Hibernate automatisch übernommen wird.
  • In einer Single-Thread-Umgebung ist es schneller als openSession.
  • Sie müssen zusätzliche Eigenschaften konfigurieren. “hibernate.current_session_context_class” ruft die getCurrentSession-Methode auf, andernfalls wird eine Ausnahme ausgetriggers.
 openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

Sie müssen diese Sitzungsobjekte explizit löschen und schließen. Da Sitzungsobjekte nicht threadsicher sind, müssen Sie ein Sitzungsobjekt pro Anforderung in einer Multithread-Umgebung und eine Sitzung pro Anforderung auch in Webanwendungen erstellen.

 getCurrentSession :- When you call SessionFactory. getCurrentSession, it will provide you session object which is in hibernate context and managed by hibernate internally. It is bound to transaction scope. When you call SessionFactory. getCurrentSession , it creates a new Session if not exists , else use same session which is in current hibernate context. It automatically flush and close session when transaction ends, so you do not need to do externally. If you are using hibernate in single threaded environment , you can use getCurrentSession, as it is faster in performance as compare to creating new session each time. You need to add following property to hibernate.cfg.xml to use getCurrentSession method.    thread   

SessionFactory: “Eine SessionFactory pro Anwendung pro DataBase” (Wenn Sie beispielsweise 3 DataBases in unserer Anwendung verwenden, müssen Sie für jede database das sessionFactory-Objekt erstellen, Sie müssen also 3 sessionFactorys erstellen oder aber nur eine DataBase One sessionfactory ist genug ).

Sitzung: “Eine Sitzung für einen Anfrage-Antwort-Zyklus”. Sie können die Sitzung öffnen, wenn die Anfrage kam und Sie können die Sitzung nach Abschluss des Anfrageprozesses schließen. Hinweis: – Verwenden Sie keine Sitzung für die Webanwendung.