J'ai quelques questions sur l'utilisation d'Hibernate dans l'application Web JSP.
Quelle devrait être la valeur de hibernate.current_session_context_class
?
Ensuite, lequel des énoncés suivants devrait être utilisé? Et pourquoi?
Session s = HibernateUtil.getSessionFactory().openSession();
Session s = HibernateUtil.getSessionFactory().getCurrentSession()
Enfin, lequel est le mieux "une session par application Web" ou "une session par demande"?
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"
Si nous parlons de SessionFactory.openSession ()
Et si nous parlons de SessionFactory.getCurrentSession ()
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>