Verbindung hängt nach Inaktivität

In meiner Anwendung verwaltet Spring den Verbindungspool für den Datenbankzugriff. Der Ruhezustand verwendet diese Verbindungen für seine Abfragen. Auf den ersten Blick habe ich keine Probleme mit dem Pool: Es funktioniert ordnungsgemäß mit gleichzeitigen Clients und einem Pool mit nur einer Verbindung. Ich kann viele Abfragen ausführen, sodass ich glaube, dass ich (oder Spring) keine offenen Verbindungen habe.

Mein Problem tritt nach einiger Zeit der Inaktivität auf (manchmal 30 Minuten, manchmal mehr als 2 Stunden). Wenn Hibernate dann eine Suche durchführt, dauert es zu lange. Wenn Sie log4j auf TRACE setzen, werden folgende Protokolle angezeigt:

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

Hier wird es für ca. 2 - 10 Minuten eingefroren. Aber dann geht es weiter:

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

Danach funktioniert es ohne Probleme, bis eine weitere Zeit der Inaktivität. IMHO scheint es, als ob der Verbindungspool eine ungültige / geschlossene Verbindung zurückgibt. Wenn der Ruhezustand dies erkennt, fragen Sie eine andere Verbindung zum Pool.

Ich weiß nicht, wie ich dieses Problem lösen kann oder was ich tun kann, um es abzugrenzen. Jede mögliche Hilfe, die dieses erzielt, wird geschätzt.

Vielen Dank.

EDIT: Nun, es war endlich eine Firewall-Regel fällig. Die Datenbank erkennt, dass die Verbindung unterbrochen wurde, der Pool (dbcp oder c3p0) jedoch nicht. Daher wird versucht, die Datenbank ohne Erfolg abzufragen. Was für mich immer noch seltsam ist, ist, dass die Timeout-Zeit sehr unterschiedlich ist. Möglicherweise ist die Regel besonders seltsam oder die Firewall funktioniert nicht richtig. Wie auch immer, ich habe keinen Zugang zu dieser Maschine und kann nur auf eine Erklärung warten. :(

Antworten auf die Frage(5)

Ihre Antwort auf die Frage