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, lequel est le meilleur "une session par application web" ou "une session par requête"?

118
demandé sur Luiggi Mendoza 2011-11-08 10:20:49

4 réponses

, Comme expliqué dans ce forum post - , 1 et 2 sont liés. Si vous définissez hibernate.current_session_context_class sur thread, puis implémentez quelque chose comme un filtre de servlet qui ouvre la session, vous pouvez accéder à cette session n'importe où ailleurs 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 cela.

Si vous utilisez Spring ou EJBs pour gérer les transactions, vous pouvez configurez-les 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 requête "ou"une session par transaction"

127
répondu gkamal 2015-06-17 13:54:57

Si nous parlons de SessionFactory.openSession ()

  • il crée toujours un nouvel objet de Session.
  • vous devez vider et fermer explicitement les objets 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 nous parlons de SessionFactory.getCurrentSession ()

  • il crée une nouvelle Session si elle n'existe pas, sinon utilisez la même session qui est en cours contexte d'hibernation.
  • vous n'avez pas besoin de vider et de fermer les objets de session, il sera automatiquement pris en charge par Hibernate en interne.
  • dans un environnement mono-thread, il est plus rapide que openSession.
  • vous devez configurer une propriété supplémentaire. "hiberner.current_session_context_class " pour appeler la méthode getCurrentSession, sinon elle lancera une exception.
21
répondu Ramu Agrawal 2017-02-19 16:20:40

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

Vous devez vider et fermer explicitement ces objets de session.

Comme les objets de session ne sont pas thread safe, vous devez créer un objet de session par requête dans un environnement multithread et une session par requête dans les applications web.

getCurrentSession: Lorsque vous appelez SessionFactory.getCurrentSession, il vous fournira l'objet de session qui est dans le contexte hibernate et géré par hibernate 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 est dans le contexte hibernate actuel. Il vide et ferme automatiquement la session à la fin de la transaction, vous n'avez donc pas besoin de le faire en externe.

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

, Vous devez ajouter 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>
2
répondu Neeraj Gahlawat 2018-09-23 06:31:52

SessionFactory: "une SessionFactory par application et par base de données" ( par exemple, si vous utilisez 3 bases de données dans notre application, vous devez créer l'objet sessionFactory par chaque base de données , totalement vous devez créer 3 sessionFactorys . ou bien si vous n'avez qu'une seule base de données une sessionfactory suffit ).

Session: "une session pour un cycle demande-réponse". vous pouvez ouvrir la session lorsque la demande est arrivée et vous pouvez fermer la session après l'achèvement du processus de demande. Remarque: - Ne pas utiliser une seule session pour l'application web.

-4
répondu swamy 2014-10-22 21:38:35