2010-10-13 13 views
12

Mi aplicación tiene transacciones de larga ejecución y por lo tanto probé la opción session.close() al final de cada método para asegurar que los objetos de conexión no se mantengan indefinidamente durante mucho tiempo .Hibernate session.close() no devuelve la conexión al grupo

Cuando se utiliza la opción session.close(), pude ver que el objeto de sesión de Hibernate y el objeto Connection correspondiente obtenido de session.connection() se destruyen correctamente. Pero el problema es con el grupo de conexiones. La conexión obtenida por la sesión no se devuelve al grupo de conexiones incluso después de cerrar la sesión. Se encuentran otras solicitudes esperando la conexión del grupo.

Estoy usando transacción JTA en mi aplicación. En hibernate.cfg.xml, configuré connection.release_mode en automático (predeterminado) y connection.autocommit en verdadero.

¿Alguien ha enfrentado este problema? Por favor, hágame saber lo que me estoy perdiendo aquí.

Seguimiento: Esta es mi hibernación detalles fichero de configuración:

<property name="connection.datasource">MXoraDS</property> 
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> 
<property name="connection.release_mode">after_statement</property> 
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property> 
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property> 
<property name="hibernate.current_session_context_class">org.hibernate.context.JTASessionContext</property> 
<property name="transaction.auto_close_session">true</property> 
<property name="max_fetch_depth">2</property> 

Utilizamos JSF y EJB 2.1 en la capa de aplicación que se conecta a la base de datos Oracle. El after_statement no parece liberar la conexión al grupo. Por favor, avíseme si necesita más detalles.

+0

debe dar más información acerca de la configuración. como qué dirección de transacción y configuración de transacción, cómo gestiona sus transacciones, etc. – Salandur

Respuesta

0

si está utilizando el JDBCTransactionManager, la conexión se devolverá a la lista de conexiones cuando finalicen las transacciones.

+0

Hola, gracias por su respuesta. Estamos utilizando Weblogic Transaction Manager (org.hibernate.transaction. WeblogicTransactionManagerLookup) y JTATransactionFactory. La transacción es administrada por el contenedor que se encarga del objeto de conexión. Al usar CMT, ¿no es posible devolver la conexión a la agrupación de conexiones programáticamente al cerrar la sesión de hibernación? – Perfuser123

+0

en ese caso, weblogic agrega la conexión a la transacción. cuando la transacción finaliza, weblogic devolverá la conexión al grupo – Salandur

+0

Sí, devuelve la conexión al grupo una vez que la transacción finaliza por commit o rollback. Pero dentro de la transacción tengo llamadas a aplicaciones externas que tardan más tiempo en ejecutarse. Estoy intentando cerrar la conexión y devolverla a la agrupación justo antes de la llamada a los métodos de larga ejecución y volver a conectarla de ser necesario. De esta manera no mantendré la conexión por mucho tiempo. Por favor dime si esto es posible. ¿Puedo devolver una conexión al grupo utilizando session.close o desconectarme dentro de una transacción de larga ejecución? – Perfuser123

19

Estoy usando transacción JTA en mi aplicación. En hibernate.cfg.xml, configuré connection.release_mode en automático (predeterminado) y connection.autocommit en verdadero.

¿Podría tratar de definir la propiedad hibernate.connection.release_mode explícitamente en after_statement? Sé que esto se supone que es el predeterminado pero, dependiendo de su contexto (¿podría estar utilizando Spring?), Es posible que auto no se comporte como se esperaba (vea hereyhere).

Para referencia, aquí es lo que el Table 3.4. Hibernate JDBC and Connection Properties escribe sobre la propiedad hibernate.connection.release_mode:

Especifica cuándo Hibernate debe conexiones JDBC liberación. De forma predeterminada, se mantiene una conexión JDBC hasta que la sesión se cierre explícitamente o desconectado. Para una aplicación fuente de datos JTA del servidor, use after_statement para lanzar agresivamente libere las conexiones después de cada llamada a JDBC . Para una conexión que no sea JTA, a menudo tiene sentido liberar la conexión al final de cada transacción , utilizando after_transaction. auto elija after_statement para las estrategias de transacción JTA y CMT y after_transaction para la estrategia de transacción JDBC .

por ejemploauto (predeterminado) | on_close | after_transaction | after_statement

Este ajuste sólo afecta Sesiones regresó de SessionFactory.openSession. Para Sesiones obtiene a través SessionFactory.getCurrentSession, la CurrentSessionContext aplicación configurado para su uso controla el modo de liberación conexión para aquellos Sesiones. Ver Section 2.5, “Contextual sessions”

Si no ayuda, por favor agregue más detalles acerca de su entorno y la configuración (primavera?), ¿Cómo se obtiene la sesión, etc.

+0

Esta es mi hibernación detalles fichero de configuración: MXoraDS propiedad name = "connection.release_mode"> after_statement org.hibernate.transaction.WeblogicTransactionManagerLookup nombre org.hibernate.Transaction .JTATransactionFactory Perfuser123

+0

Más detalles: org.h ibernate.context.JTASessionContext true 2 Utilizamos JSF y EJB 2.1 en la capa de aplicación que se conecta a la base de datos Oracle. El after_statement no parece liberar la conexión al grupo. Háganme saber si necesita más información. – Perfuser123

Cuestiones relacionadas