2011-11-08 14 views
110

Ho alcune domande sull'utilizzo di Hibernate nell'applicazione web JSP.Hibernate openSession() vs getCurrentSession()

  1. Quale dovrebbe essere il valore per hibernate.current_session_context_class?

  2. Quindi, quale delle seguenti affermazioni dovrebbe essere utilizzata? E perché?

    Session s = HibernateUtil.getSessionFactory().openSession(); 
    Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
    
  3. Infine, quale è meglio "una seduta al web app" o "una sessione per ogni richiesta"?

risposta

122

Come spiegato in questo forum post, 1 e 2 sono correlati. Se si imposta hibernate.current_session_context_class per il thread e quindi si implementa qualcosa come un filtro servlet che apre la sessione, è possibile accedere a quella sessione in qualsiasi altro punto utilizzando SessionFactory.getCurrentSession().

SessionFactory.openSession() apre sempre una nuova sessione che è necessario chiudere dopo aver terminato le operazioni. SessionFactory.getCurrentSession() restituisce una sessione associata a un contesto: non è necessario chiuderla.

Se si utilizza Spring o EJB per gestire le transazioni, è possibile configurarle per aprire/chiudere sessioni insieme alle transazioni.

Non utilizzare mai one session per web app - la sessione non è un oggetto thread-safe - non può essere condiviso da più thread. Si dovrebbe sempre usare "una sessione per ogni richiesta" o "una sessione per transazione"

+0

Grazie mille, @gkamal. Osservo il codice in [Open Session in View] (http://community.jboss.org/wiki/OpenSessionInView) del documento. (Il tuo link rimanda a quei documenti.) L'autore suggerisce l'uso del filtro. Nel suo codice di filtro, non chiama 'openSession()' o 'close()'. Chiama solo 'getCurrentSession()'. Immagino che abbia impostato 'current_session_context' su' thread'. Ora penso di capire 'getCurrentSession()'. Tuttavia, non so quando dovrei usare 'openSession()'. – wannik

+4

Utilizzerai OpenSession se non desideri che la sessione sia associata a qualsiasi contesto. Vi sono alcune situazioni in cui è necessaria una sessione diversa, diversa da quella vincolata al contesto (gli Hibernate Interceptors hanno una limitazione che non è possibile utilizzare la sessione originale): in questi casi si utilizzerà OpenSession anziché currentSession. OpenSession crea una nuova sessione che devi chiudere esplicitamente. Ad esempio, in un metodo DAO chiamerai OpenSession: usa la sessione e chiudila. – gkamal

+0

am usando getCurrentSession(); perché l'ho inizializzato in listener non filtro è ok dal tuo punto di vista; sto usando mvc2 servlet jsp – shareef

-4

SessionFactory: "Una SessionFactory per applicazione per database" ( ad esempio, se si utilizzano 3 del DataBase nella nostra applicazione, è necessario creare oggetto sessionFactory per ogni DB, è assolutamente necessario creare 3 sessionFactorys, oppure se si ha una sola sessione di DataBase One è sufficiente ).

Sessione: "Una sessione per un ciclo di richiesta-risposta". puoi aprire la sessione quando arriva la richiesta e puoi chiudere la sessione dopo il completamento del processo di richiesta. Nota: -Non usare una sessione per l'applicazione web.

13

Se parliamo di SessionFactory.openSession()

  • E creare sempre nuovo oggetto Session.
  • È necessario eseguire il flush e chiudere esplicitamente gli oggetti di sessione.
  • In ambiente a thread singolo è più lento di getCurrentSession.
  • Non è necessario configurare alcuna proprietà per chiamare questo metodo.

E Se parliamo di SessionFactory.getCurrentSession()

  • Si crea una nuova sessione, se non esiste, altrimenti utilizzare stessa sessione, che è in un contesto di ibernazione corrente.
  • Non è necessario svuotare e chiudere gli oggetti di sessione, verrà automaticamente gestito da Hibernate internamente.
  • In ambiente a thread singolo è più veloce di openSession.
  • È necessario configurare proprietà aggiuntive. "hibernate.current_session_context_class" per chiamare il metodo getCurrentSession, altrimenti genererà un'eccezione.
0
openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

È necessario in modo esplicito a filo e chiudere questi oggetti di sessione. Poiché gli oggetti di sessione non sono thread-safe, è necessario creare un oggetto sessione per richiesta in ambiente multithread e una sessione per richiesta anche nelle applicazioni Web.

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. 



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