La conexión se cuelga después de un tiempo de inactividad.

En mi aplicación, Spring administra el conjunto de conexiones para el acceso a la base de datos. Hibernate utiliza estas conexiones para sus consultas. A primera vista, no tengo problemas con la agrupación: funciona correctamente con clientes concurrentes y una agrupación con una sola conexión. Puedo ejecutar muchas consultas, por lo que creo que yo (o Spring) no dejamos conexiones abiertas.

Mi problema aparece después de un tiempo de inactividad (a veces 30 minutos, a veces más de 2 horas). Entonces, cuando Hibernate hace una búsqueda, dura demasiado. Al establecer el nivel log4j en TRACE, obtengo estos registros:

...
18:27:01 DEBUG nsactionSynchronizationManager  - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@99abd7] for key [org.hibernate.impl.SessionFactoryImpl@7d2897] bound to thread [http-8080-Processor24]
18:27:01 DEBUG HibernateTransactionManager     - Found thread-bound Session [org.hibernate.impl.SessionImpl@8878cd] for Hibernate transaction
18:27:01 DEBUG HibernateTransactionManager     - Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@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 [org.hibernate.impl.SessionImpl@8878cd]
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 unos 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 [org.springframework.jdbc.datasource.ConnectionHolder@843a9d] for key [org.apache.commons.dbcp.BasicDataSource@7745fd] 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 la agrupación de conexiones devuelve una conexión no válida / cerrada, y cuando Hibernate se da cuenta de eso, pregunte otra conexión a la agrupación.

No sé cómo puedo resolver este problema o las cosas que puedo hacer para delimitarlo. Cualquier ayuda para lograr esto será apreciada.

Gracias.

EDIT: Bueno, finalmente fue debido una regla de firewall. La base de datos detecta que la conexión se ha perdido, pero la agrupación (dbcp o c3p0) no. Por lo tanto, intenta consultar la base de datos sin éxito. Lo que aún 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. :(

Respuestas a la pregunta(5)

Su respuesta a la pregunta