En mi aplicación, Spring administra el grupo de conexiones para acceder a la base de datos. Hibernate usa estas conexiones para sus consultas. A primera vista, no tengo problemas con el grupo: funciona correctamente con clientes simultáneos y un grupo con una sola conexión. Puedo ejecutar muchas consultas, así que creo que yo (o Spring) no dejo conexiones abiertas.La conexión se bloquea después del tiempo de inactividad
Mi problema aparece después de un tiempo de inactividad (a veces 30 minutos, a veces más de 2 horas). Entonces, cuando Hibernate realiza una búsqueda, dura demasiado. Estableciendo el nivel log4j en TRACE, obtengo estos registros:
...
18:27:01 DEBUG nsactionSynchronizationManager - Retrieved value [[email protected]] for key [[email protected]] bound to thread [http-8080-Processor24]
18:27:01 DEBUG HibernateTransactionManager - Found thread-bound Session [[email protected]] for Hibernate transaction
18:27:01 DEBUG HibernateTransactionManager - Using transaction object [org.springframework.orm.hi[email protected]1b2ffee]
18:27:01 DEBUG HibernateTransactionManager - Creating new transaction with name [com.acjoventut.service.GenericManager.findByExample]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
18:27:01 DEBUG HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [[email protected]]
18:27:01 TRACE SessionImpl - setting flush mode to: AUTO
18:27:01 DEBUG JDBCTransaction - begin
18:27:01 DEBUG ConnectionManager - opening JDBC connection
Aquí se congela durante aproximadamente 2 - 10 minutos. Pero luego continúa:
18:30:11 DEBUG JDBCTransaction - current autocommit status: true
18:30:11 DEBUG JDBCTransaction - disabling autocommit
18:30:11 TRACE JDBCContext - after transaction begin
18:30:11 DEBUG HibernateTransactionManager - Exposing Hibernate transaction as JDBC transaction [jdbc:oracle:thin:@212.31.39.50:30998:orcl, UserName=DEVELOP, Oracle JDBC driver]
18:30:11 DEBUG nsactionSynchronizationManager - Bound value [[email protected]] for key [[email protected]] to thread [http-8080-Processor24]
18:30:11 DEBUG nsactionSynchronizationManager - Initializing transaction synchronization
...
Después de eso, funciona sin problemas, hasta otro período de inactividad. En mi humilde opinión, parece que el grupo de conexiones devuelve una conexión no válida/cerrada, y cuando Hibernate se da cuenta de eso, solicita otra conexión al grupo.
No sé cómo puedo solucionar este problema o las cosas que puedo hacer para delimitarlo. Cualquier ayuda para lograr esto será apreciada.
Gracias.
EDITAR: Bueno, finalmente se debió a una regla de firewall. La base de datos detecta que la conexión se ha perdido, pero el conjunto (dbcp o c3p0) no. Por lo tanto, intenta consultar la base de datos sin éxito. Lo que todavía me resulta extraño es que el tiempo de espera es muy variable. Tal vez la regla es especialmente extraña o el firewall no funciona correctamente. De todos modos, no tengo acceso a esa máquina y solo puedo esperar una explicación. :(
¿Cómo identificó si se trataba de un problema de firewall? Me enfrenta a un problema similar donde dbcp se cuelga indefinidamente en mi transacción de Spring Batch y nunca regresa – YogendraJ