Hibernate openSession () vs getCurrentSession ()

Eu tenho algumas perguntas sobre o uso do Hibernate no aplicativo da Web JSP.

  1. Qual deve ser o valor para hibernate.current_session_context_class ?

  2. Então, qual das seguintes afirmações deve ser usada? E porque?

      Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
  3. Por fim, qual é melhor “uma session por aplicativo da web” ou “uma session por solicitação”?

Conforme explicado neste post do fórum, 1 e 2 estão relacionados. Se você definir hibernate.current_session_context_class para thread e, em seguida, implementar algo como um filtro de servlet que abre a session – então você pode acessar essa session em qualquer outro lugar usando o SessionFactory.getCurrentSession() .

SessionFactory.openSession() sempre abre uma nova session que você precisa fechar quando terminar as operações. SessionFactory.getCurrentSession() retorna uma session ligada a um contexto – você não precisa fechar isto.

Se você estiver usando Spring ou EJBs para gerenciar transactions, poderá configurá-las para abrir / fechar sessões junto com as transactions.

Você nunca deve usar one session per web app – a session não é um object seguro para encadeamento – não pode ser compartilhada por vários encadeamentos. Você deve sempre usar “uma session por solicitação” ou “uma session por transação”

Se falamos de SessionFactory.openSession ()

  • Sempre cria um novo object Session.
  • Você precisa esvaziar e fechar explicitamente os objects da session.
  • No ambiente de encadeamento único, é mais lento que getCurrentSession.
  • Você não precisa configurar nenhuma propriedade para chamar esse método.

E se falamos de SessionFactory.getCurrentSession ()

  • Ele cria uma nova session se não existir, senão use a mesma session que está no contexto de hibernação atual.
  • Você não precisa liberar e fechar objects de session, ele será automaticamente cuidado pelo Hibernate internamente.
  • No ambiente de encadeamento único, é mais rápido que o openSession.
  • Você precisa configurar uma propriedade adicional. “hibernate.current_session_context_class” para chamar o método getCurrentSession, caso contrário ele lançará uma exceção.
 openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

Você precisa esvaziar e fechar explicitamente esses objects de session. Como os objects de session não são thread-safe, é necessário criar um object de session por solicitação no ambiente multithread e uma session por solicitação em aplicativos da Web também.

 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: “Uma SessionFactory por aplicação por DataBase” (por exemplo, se você usa 3 DataBase’s em nosso aplicativo, você precisa criar o object sessionFactory para cada DB, totalmente você precisa criar 3 sessionFactorys. Ou então se você tiver apenas uma DataBase One sessionfactory basta ).

Sessão: “Uma session para um ciclo de solicitação-resposta”. você pode abrir a session quando a solicitação chegar e você pode fechar a session após a conclusão do processo de solicitação. Nota: -Não use uma session para aplicação web.