Saltar al contenido

Hibernate openSession () frente a getCurrentSession ()

Solución:

Como se explica en esta publicación del foro, 1 y 2 están relacionados. Si pones hibernate.current_session_context_class para enhebrar y luego implementar algo como un filtro de servlet que abre la sesión; luego puede acceder a esa sesión en cualquier otro lugar utilizando el 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 cerrar esto.

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

Nunca deberías usar one session per web app – la sesión no es un objeto seguro para subprocesos – no puede ser compartida por varios subprocesos. Siempre debe usar “una sesión por solicitud” o “una sesión por transacción”

Si hablamos de SessionFactory.openSession ()

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

Y si hablamos de SessionFactory.getCurrentSession ()

  • Crea una nueva sesión si no existe, de lo contrario usa la misma sesión que está en el contexto de hibernación actual.
  • No necesita vaciar y cerrar los objetos de la sesión, Hibernate se encargará automáticamente de ello internamente.
  • En un entorno de un solo subproceso, es más rápido que openSession ().
  • Necesita configurar una propiedad adicional. “hibernate.current_session_context_class” para llamar al método getCurrentSession (), de lo contrario lanzará una excepción.

openSession: Cuando usted llama SessionFactory.openSession, siempre crea una nueva Session objeto y dárselo.

Necesita vaciar y cerrar explícitamente estos objetos de sesión.

Como los objetos de la sesión son no seguro para subprocesos, debe crear un objeto de sesión por solicitud en un entorno de subprocesos múltiples y una sesión por solicitud también en aplicaciones web.

getCurrentSession: Cuando usted llama SessionFactory.getCurrentSession, le proporcionará un objeto de sesión que está en contexto de hibernación y gestionado por hibernación internamente. Está vinculado al alcance de la transacción.

Cuando usted llama SessionFactory.getCurrentSession, crea un nuevo Session si no existe, de lo contrario use la misma sesión que está en el contexto de hibernación actual. Se vacía automáticamente y cierra la sesión cuando finaliza la transacción, por lo que no es necesario que lo haga externamente.

Si está utilizando hibernación en un entorno de un solo subproceso, puede utilizar getCurrentSession, ya que tiene un rendimiento más rápido en comparación con la creación de una nueva sesión cada vez.

Necesita agregar la siguiente propiedad a hibernate.cfg.xml usar getCurrentSession método:

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *