Соединение зависает после времени бездействия

В моем приложении Spring управляет пулом соединений для доступа к базе данных. Hibernate использует эти соединения для своих запросов. На первый взгляд, у меня нет проблем с пулом: он корректно работает с одновременными клиентами и пулом только с одним подключением. Я могу выполнить много запросов, поэтому я думаю, что я (или Spring) не оставляю открытых соединений.

Моя проблема появляется после некоторого времени бездействия (иногда 30 минут, иногда более 2 часов). Затем, когда Hibernate выполняет поиск, он длится слишком долго. Устанавливая уровень log4j в TRACE, я получаю следующие журналы:

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

Здесь он замерзает на 2 - 10 минут. Но потом продолжается:

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

После этого все работает без проблем, до очередного периода бездействия. ИМХО, похоже, что пул соединений возвращает неверное / закрытое соединение, и когда Hibernate осознает это, попросите другое соединение с пулом.

Я не знаю, как я могу решить эту проблему или что я могу сделать для ее определения. Любая помощь в достижении этого будет признательна.

Благодарю.

РЕДАКТИРОВАТЬ: Ну, это, наконец, из-за правила брандмауэра. База данных обнаруживает, что соединение потеряно, но пул (dbcp или c3p0) нет. Таким образом, он пытается запросить базу данных безуспешно. Что еще странно для меня, так это то, что период ожидания очень изменчив. Возможно, правило особенно странное или брандмауэр работает неправильно. В любом случае, у меня нет доступа к этой машине, и я могу только ждать объяснения. :(

Ответы на вопрос(5)

Ваш ответ на вопрос