web-dev-qa-db-fra.com

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 devrait être utilisé? Et pourquoi?

     Session s = HibernateUtil.getSessionFactory().openSession();
     Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. Enfin, lequel est le mieux "une session par application Web" ou "une session par demande"?

125
wannik

Comme expliqué dans ce forum post , 1 et 2 sont liés. Si vous définissez hibernate.current_session_context_class pour thread, puis implémentez quelque chose comme un filtre de servlet qui ouvre la session - vous pouvez alors accéder à cette session n'importe où ailleurs à l'aide de la fonction SessionFactory.getCurrentSession().

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

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

Vous ne devez jamais utiliser one session per web app - la session n'est pas un objet thread-safe - ne peut pas être partagée par plusieurs threads. Vous devez toujours utiliser "une session par demande" ou "une session par transaction"

136
gkamal

Si nous parlons de SessionFactory.openSession ()

  • Il crée toujours un nouvel objet Session.
  • Vous devez explicitement vider et fermer les objets de session.
  • Dans un environnement à thread unique, il est plus lent que getCurrentSession ().
  • Il n'est pas nécessaire de configurer une propriété pour appeler cette méthode.

Et si nous parlons de SessionFactory.getCurrentSession ()

  • Il crée une nouvelle session s'il n'existe pas, sinon utilise la même session, qui est dans le contexte d'hibernation actuel.
  • Vous n'avez pas besoin de vider et de fermer les objets de session, cela sera automatiquement pris en charge par Hibernate en interne.
  • Dans un environnement à thread unique, il est plus rapide que openSession ().
  • Vous devez configurer une propriété supplémentaire. "hibernate.current_session_context_class" pour appeler la méthode getCurrentSession (), sinon une exception sera levée.
28
Ramu Agrawal

openSession: Lorsque vous appelez SessionFactory.openSession, il crée toujours un nouvel objet Session et vous le donne.

Vous devez explicitement vider et fermer ces objets de session.

Comme les objets de session ne sont pas thread-safe, vous devez créer un objet de session par demande dans un environnement multithread et une session par demande dans les applications Web.

getCurrentSession: Lorsque vous appelez SessionFactory.getCurrentSession, il vous fournira un objet de session qui est dans un contexte d'hibernation et géré par hibernate en interne. Il est lié à la portée de la transaction.

Lorsque vous appelez SessionFactory.getCurrentSession, il crée un nouveau Session s'il n'existe pas. Sinon, utilisez la même session qui se trouve dans le contexte d'hibernation actuel. Il efface et ferme automatiquement la session à la fin de la transaction. Vous n'avez donc pas besoin de le faire en externe.

Si vous utilisez la mise en veille prolongée dans un environnement mono-thread, vous pouvez utiliser getCurrentSession, car ses performances sont plus rapides que la création d'une nouvelle session à chaque fois.

Vous devez ajouter la propriété suivante à hibernate.cfg.xml pour utiliser la méthode getCurrentSession:

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>
5
Neeraj Gahlawat