2011-11-08 8 views
110

Tengo algunas preguntas sobre el uso de Hibernate en la aplicación web JSP.Hibernate openSession() vs getCurrentSession()

  1. ¿Cuál debería ser el valor de hibernate.current_session_context_class?

  2. Entonces, ¿cuál de las siguientes afirmaciones debería usarse? ¿Y por qué?

    Session s = HibernateUtil.getSessionFactory().openSession(); 
    Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
    
  3. Por último, ¿cuál es mejor "una sesión por aplicación web" o "una sesión por solicitud"?

Respuesta

122

Como se explica en este foro post, 1 y 2 están relacionados. Si establece hibernate.current_session_context_class para enhebrar y luego poner en práctica algo así como un filtro de servlet que se abre la sesión - entonces usted puede tener acceso a esa sesión en otro sitio mediante el uso de la SessionFactory.getCurrentSession().

SessionFactory.openSession() siempre abre una nueva sesión que debe cerrar una vez que haya terminado con las operaciones. SessionFactory.getCurrentSession() devuelve una sesión vinculada a un contexto; no es necesario que cierre esto.

Si está utilizando Spring o EJB para administrar transacciones, puede configurarlas para abrir/cerrar sesiones junto con las transacciones.

Nunca debe usar one session per web app - la sesión no es un objeto seguro para subprocesos: no se puede compartir con varios subprocesos. Siempre se debe utilizar "una sesión por solicitud" o "una sesión por transacción"

+0

Muchas gracias, @gkamal. Miro el código en el documento [Abrir sesión en la vista] (http://community.jboss.org/wiki/OpenSessionInView). (Su enlace apunta a esos documentos). El autor sugiere el uso de filtros. En su código de filtro, no llama a 'openSession()' o 'close()'. Él solo llama a 'getCurrentSession()'. Supongo que establece 'current_session_context' en' thread'. Ahora creo que entiendo 'getCurrentSession()'. Sin embargo, no sé cuándo debería usar 'openSession()'. – wannik

+4

Utilizará OpenSession si no desea que la sesión se vincule a ningún contexto. Hay algunas situaciones en las que necesitaría una sesión diferente, distinta de una vinculada al contexto (los Interceptores Hibernate tienen una limitación de que no puede usar la sesión original); en esos casos, usaría OpenSession en lugar de currentSession. OpenSession crea una nueva sesión que debe cerrar explícitamente. Por ejemplo, en un método DAO llamará a OpenSession: use la sesión y ciérrela. – gkamal

+0

estoy usando getCurrentSession(); porque lo inicialicé en listener not filter está bien desde tu vista; Estoy usando mvc2 jsp servlet – shareef

-4

SessionFactory: "Una SessionFactory por aplicación por base de datos" ( por ejemplo, si utiliza 3 de base de datos en nuestra aplicación, es necesario crear Objeto sessionFactory por cada base de datos, es necesario crear 3 SessionFactorys. De lo contrario, si tiene solo una base de datos de DataBase One, la base de datos es suficiente .

Sesión: "Una sesión para un ciclo de solicitud-respuesta". puede abrir la sesión cuando llega la solicitud y puede cerrar la sesión después de completar el proceso de solicitud. Nota: -No use una sesión para la aplicación web.

13

Si hablamos de sessionFactory.openSession()

  • Siempre crear nuevo objeto Session.
  • Necesita vaciar y cerrar explícitamente objetos de sesión.
  • En el entorno de un solo subproceso es más lento que getCurrentSession.
  • No necesita configurar ninguna propiedad para llamar a este método.

Y Si hablamos de SessionFactory.getCurrentSession()

  • Se crea una nueva sesión, si no existe, de lo contrario usar una misma sesión que está en hibernación contexto actual.
  • que no es necesario para limpiar y objetos de sesión cierre, se tendrá cuidado de forma automática por Hibernate internamente.
  • En un entorno de subproceso único, es más rápido que openSession.
  • Necesita configurar propiedad adicional. "hibernate.current_session_context_class" para llamar al método getCurrentSession, de lo contrario generará una excepción.
0
openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

Necesitas explícitamente al ras y cierre de sesión estos objetos. Como los objetos de sesión no son seguros para subprocesos, debe crear un objeto de sesión por solicitud en un entorno multiproceso y una sesión por solicitud en las aplicaciones web también.

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> 
Cuestiones relacionadas