2012-01-04 17 views
15

¿Cómo se debe hacer correctamente el "ciclo de vida" de una sesión de Hibernate en Spring?Ciclo de vida de sesión de Spring + Hibernate

SessionFactory es creado automáticamente por Spring y toma sus conexiones de DB del grupo de conexiones Glassfish. En este momento estoy recibiendo una sesión de Hibernate a través del SessionFactory.getCurrentSession(). Luego empiezo la transacción, hago el trabajo y luego commit() o rollback() al final. ¿Debo realizar alguna otra acción, como disconnect(), close(), flush() o cualquier otra en cualquier momento, para que las conexiones se devuelvan correctamente al grupo o todo lo hace automáticamente Spring?

Con muchos de estos métodos, es un poco confuso para mí en este momento entender cuándo se debe hacer, tal vez alguien puede indicar la dirección correcta.

Respuesta

12

Como SessionFactory se crea automáticamente por Spring, Spring framework se encargará de cerrar la conexión. Echa un vistazo Spring Resource Management

Si quieres comprobar. Puede verificar el registro si está utilizando el registro para su aplicación. Será como:

(principal) INFO [AnnotationSessionFactoryBean] Cierre Hibernate SessionFactory

me sale siguientes líneas de this link

El contrato principal aquí es la creación de instancias de Session . Por lo general, una aplicación tiene una sola instancia de SessionFactory y las solicitudes de cliente de servicio obtienen instancias de sesión de esta fábrica. El estado interno de una SessionFactory es inmutable. Una vez que se ha creado , se establece este estado interno. Este estado interno incluye todos los de los metadatos sobre Objeto/Mapeo Relacional. Los implementadores deben ser seguros para la rosca.

+0

SessionFactory está en mi sistema configurado como bean singleton, por lo que nunca se cerraría ... – Laimoncijus

+0

@Laimoncijus: SessionFactory es por defecto singleton. Respuesta modificada en consecuencia. Verifíquelo –

+0

Entonces, no necesita configurar sessionfactory singleton. También verifique esta respuesta: http://stackoverflow.com/questions/8523332/close-opened-hibernation-sessions-if-exist/8530891#8530891 –

2

Hope this enlace le guiará sobre la sesión y las transacciones.

Luego comienzo la transacción, hago el trabajo y luego confirmo() o retrotrajo() al final. ¿Debo realizar otras acciones como desconectar(), cerrar(), flush() u otras en cualquier momento para que las conexiones sean devueltas correctamente al grupo o todo lo que ya está hecho automáticamente por Spring?

Al llamar a commit() en Transaction, se cerrará automáticamente la sesión, lo que finalmente llama al método close on connection para volver a su grupo.

3

Cuando está ejecutando una consulta de hibernación a través de SessionFactory.getCurrentSession(), Spring realiza la tarea necesaria para abrir y cerrar la conexión. SessionFactory que está utilizando en Spring Config también llama internamente al método config.buildSessionFactory.

La mayor parte de esto ocurre en las implementaciones de AbstractSessionFactoryBean. El cierre de la conexión se realiza por hibernación en la clase SessionFactoryImpl utilizando la instrucción settings.getConnectionProvider(). Close(); . En resumen, hibernate hace todo por ti.Spring solo llama a su ayuda cuando sea necesario.

6

Las políticas sobre cómo los comunicados de conexión de nuevo a la agrupación de conexiones no tienen nada que ver con la primavera .Es se configura por sí mismo Hibernate a través del parámetro de configuración hibernate.connection.release_mode, que se identifica mediante la enumeración en el org.hibernate.ConnectionReleaseMode

inicio de versión 3.1+, el valor predeterminado de hibernate.connection.release_mode es auto, que el valor ConnectionReleaseMode correspondiente depende de si se utiliza la transacción JTA o JDBC. En caso de que se utilice la transacción JDBC, se establece en ConnectionReleaseMode.AFTER_TRANSACTION (es decir, after_transaction).

El comportamiento de ConnectionReleaseMode.AFTER_TRANSACTION es que: La conexión será devuelto a la agrupación de conexiones después de cada transacción, es decir, llamando ya sea transaction.commit() o transaction.rollback(), así como llamar session.close() y session.disconnect()

puede verificar este comportamiento en hibernate documentation Section 11.5.

Cuestiones relacionadas