Conexão trava após o tempo de inatividade

No meu aplicativo, o Spring gerencia o pool de conexão para acesso ao banco de dados. O Hibernate usa essas conexões para suas consultas. À primeira vista, não tenho problemas com o pool: ele funciona corretamente com clientes simultâneos e um pool com apenas uma conexão. Eu posso executar muitas consultas, então eu acho que eu (ou Spring) não deixo conexões abertas.

Meu problema aparece depois de algum tempo de inatividade (às vezes 30 minutos, às vezes mais de 2 horas). Então, quando o Hibernate faz alguma pesquisa, dura muito. Definindo o nível log4j como TRACE, recebo esses logs:

...
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

Aqui fica congelado por cerca de 2 a 10 minutos. Mas então continua:

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
...

Depois disso, funciona sem problemas, até outro período de inatividade. IMHO, parece que o pool de conexão retorna uma conexão inválida / fechada, e quando o Hibernate percebe isso, peça outra conexão ao pool.

Não sei como posso resolver este problema ou coisas que posso fazer para delimitá-lo. Qualquer ajuda para conseguir isso será apreciado.

Obrigado.

EDIT: Bem, finalmente foi devido a uma regra de firewall. Banco de dados detecta a conexão é perdida, mas pool (dbcp ou c3p0) não. Então, ele tenta consultar o banco de dados sem sucesso. O que ainda é estranho para mim é que o período de tempo limite é muito variável. Talvez a regra seja especialmente estranha ou o firewall não funcione corretamente. De qualquer forma, não tenho acesso a essa máquina e só posso esperar por uma explicação. :(

questionAnswers(5)

yourAnswerToTheQuestion