Hibernate openSession () vs getCurrentSession ()

J’ai quelques questions sur l’utilisation d’Hibernate dans l’application Web JSP.

  1. Quelle devrait être la valeur de hibernate.current_session_context_class ?

  2. Ensuite, lequel des énoncés suivants doit être utilisé? Et pourquoi?

      Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
  3. Enfin, laquelle est la meilleure “une session par application web” ou “une session par requête”?

Comme expliqué dans ce forum, 1 et 2 sont liés. Si vous définissez hibernate.current_session_context_class sur thread et que vous implémentez quelque chose comme un filtre de servlet qui ouvre la session, vous pouvez accéder à cette session n’importe où en utilisant SessionFactory.getCurrentSession() .

SessionFactory.openSession() ouvre toujours une nouvelle session que vous devez fermer une fois que vous avez terminé les opérations. SessionFactory.getCurrentSession() renvoie une session liée à un contexte – vous n’avez pas besoin de fermer cette session.

Si vous utilisez Spring ou EJB pour gérer les transactions, vous pouvez les configurer pour ouvrir / fermer des sessions avec les transactions.

Vous ne devriez jamais utiliser one session per web app – la session n’est pas un object thread-safe – ne peut pas être partagé par plusieurs threads. Vous devez toujours utiliser “une session par requête” ou “une session par transaction”

Si on parle de SessionFactory.openSession ()

  • Il crée toujours un nouvel object Session.
  • Vous devez explicitement vider et fermer les objects de session.
  • Dans un environnement à thread unique, il est plus lent que getCurrentSession.
  • Vous n’avez pas besoin de configurer de propriété pour appeler cette méthode.

Et si on parle de SessionFactory.getCurrentSession ()

  • Il crée une nouvelle session si elle n’existe pas, sinon utilisez la même session qui se trouve dans le contexte d’hibernation actuel.
  • Vous n’avez pas besoin de vider et de fermer les objects de session, ceux-ci seront automatiquement pris en charge par Hibernate en interne.
  • Dans un environnement à thread unique, il est plus rapide que openSession.
  • Vous devez configurer des propriétés supplémentaires. “hibernate.current_session_context_class” pour appeler la méthode getCurrentSession, sinon une exception sera lancée.
 openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

Vous devez explicitement vider et fermer ces objects de session. Comme les objects de session ne sont pas thread-safe, vous devez créer un object de session par demande dans un environnement multithread et une session par demande dans les applications Web.

 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: “One SessionFactory par application par DataBase” (par exemple, si vous utilisez 3 DataBase dans notre application, vous devez créer un object sessionFactory pour chaque DB, il vous faut absolument créer 3 sessionFactorys ou seulement une seule DataBase One sessionfactory est assez ).

Session: “Une session pour un cycle demande-réponse”. vous pouvez ouvrir la session lorsque la demande est venue et vous pouvez fermer la session après l’achèvement du processus de demande. Remarque: N’utilisez pas une session pour une application Web.