Comme expliqué dans ce message du forum , 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 le 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 la fermer.
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 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"
openSession()
ouclose()
. Il appelle seulementgetCurrentSession()
. Je suppose qu'il fixecurrent_session_context
àthread
. Maintenant, je pense que je comprendsgetCurrentSession()
. Cependant, je ne sais pas quand dois-je utiliseropenSession()
.Sessions
. Pouvez-vous s'il vous plaît m'aider avec - stackoverflow.com/questions/23351083/… . Merci et chenqui.Si nous parlons de SessionFactory.openSession ()
Et si nous parlons de SessionFactory.getCurrentSession ()
la source
getCurrentSession
, cela réutiliserait la même session, n'est-ce pas?openSession
: Lorsque vous appelezSessionFactory.openSession
, il crée toujours un nouvelSession
objet 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 multi-thread et une session par demande dans les applications Web également.
getCurrentSession
: Lorsque vous appelezSessionFactory.getCurrentSession
, il vous fournira un objet de session qui est dans un contexte de mise en veille prolongée et géré par hibernate en interne. Il est lié à la portée de la transaction.Lorsque vous appelez
SessionFactory.getCurrentSession
, il en crée un nouveauSession
s'il n'existe pas, sinon utilisez la même session qui se trouve dans le contexte de mise en veille prolongée actuel. Il vide et ferme automatiquement la session lorsque la transaction se termine, vous n'avez donc pas besoin de le faire en externe.Si vous utilisez la mise en veille prolongée dans un environnement à thread unique, vous pouvez l'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
getCurrentSession
méthode:la source
la source
SessionFactory: "Une SessionFactory par application par DataBase" (par exemple, si vous utilisez 3 DataBase dans notre application, vous devez créer un objet sessionFactory pour chaque DB, totalement vous devez créer 3 sessionFactorys. Ou bien si vous n'avez qu'une DataBase One sessionfactory est assez ).
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 une fois le processus de demande terminé. Remarque: -N'utilisez pas une seule session pour l'application Web.
la source