Hallo zusammen,
Das hier ist ein X-Post zu diesem Thread:
http://forum.hibernate.org/viewtopic.php?p=2339714.
Folgendes Setup:
Hibernate 3.1
WebSphere Application Server 5.1.1.11
IBM DB2 8.2
Mein Problem:
Wenn ich Hibernate zusammen mit einer in WebSphere konfigurierten DataSource mit einen Connection Pool verwende, kommt es beim ersten read auf die DB (mit Criteria.list) nach längerer Zeit (wenn also der Timeout im Connection Pool greift) zu einer StaleConnectionException. Das passiert nur beim ersten read, die folgenden Zugriffe klappen dann normalerweise. Wenn in der hibernate.cfg.xml an Stelle der DataSource eine JDBC URL und c3p0 als Connection Pool konfiguriert werden, tritt das Problem nicht auf. Es scheint also kein Problem der Implementierung zu sein, sondern eines mit der DataSource bzw. dem Connection Pool in WebSphere. Für mich sieht das sehr ähnlich aus wie die Probleme, die in
http://forum.hibernate.org/viewtopic.php?t=929329 bzw.
http://forum.hibernate.org/viewtopic.php?t=451 http://forum.hibernate.org/viewtopic.php?t=451 beschrieben sind, allerings gibt es die Einstellung "auto connection cleanup" nur für DataSources der Version 4 (siehe
http://publib.boulder.ibm.com/infocente ... olset.html).
Hat schon jemand eine DataSource in WebSphere 5.1 oder eine ähnliche Konfiguration erfolgreich mit Hibernate verwendet? Wie müssen die Einstellungen der DataSource und die Hibernate-Konfiguration aussehen?
Meine hibernate.cfg.xml für die DataSource sieht folgendermaßen aus:
Code:
...
<property name="hibernate.connection.datasource">jdbc/exampleDS</property>
<property name="hibernate.connection.release_mode">on_close</property>
<property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.max_fetch_depth">1</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.hbm2ddl.auto">none</property>
...
Für die Connection URL sieht die hibernate.cfg.xml so aus:
Code:
...
<property name="connection.driver_class">COM.ibm.db2.jdbc.net.DB2Driver</property>
<property name="connection.url">jdbc:db2://example.com:6789/exampleDB</property>
<property name="dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="connection.username">example</property>
<property name="connection.password">...</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.hbm2ddl.auto">none</property>
<property name="hibernate.show_sql">false</property>
<!-- configuration for c3p0 -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">90</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">50</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.timeout">900</property>
...
Die Einstellung des Connection Pools der DataSource:
connection timeout: 180 seconds
minimum connection: 1
maximum connections: 50
reap time: 180 seconds
unused Timeout: 1800 seconds
aged timeout: 0
purge policy: entire pool
Die Exception, die auftaucht ist eine com.ibm.websphere.ce.cm.StaleConnectionException:
Code:
ConnectionEve A J2CA0056I: Der Connection Manager hat einen schwerwiegenden Verbindungsfehler vom Ressourcenadapter für Ressource jdbc/exampleDS empfangen. Die Ausnahme wurde com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL30081N Kommunikationsfehler. Verwendetes Kommunikationsprotokoll: "TCP/IP". Verwendete Kommunikations-API: "SOCKETS". Position, an der der Fehler festgestellt wurde: "10.1.2.3". Kommunikationsfunktion, die den Fehler feststellte: "send". Protokollspezifische(r) Fehlercode(s): "10054", "*", "0". SQLSTATE=08001
ausgelöst.
[26.01.07 09:15:01:125 CET] 19d2a470 WSRdbManagedC E DSRA0010E: SQL-Status = 08003, Fehlercode = -99.999
[26.01.07 09:15:01:828 CET] 19d2a470 WSRdbManagedC E DSRA0010E: SQL-Status = 08003, Fehlercode = -99.999
[26.01.07 09:15:02:141 CET] 19d2a470 WSRdbManagedC W DSRA0180W: In ManagedConnection.destroy() ist eine Ausnahme eingetreten. Die Ausnahme ist com.ibm.ws.exception.WsException: DSRA0080E: An exception was received by the Data Store Adapter. See original exception message: [IBM][CLI Driver] CLI0106E Die Verbindung ist beendet. SQLSTATE=08003. with SQL State : 08003 SQL Code : -99999
at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(Unknown Source)
at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.check_return_code(Unknown Source)
at COM.ibm.db2.jdbc.app.DB2Connection.rollback(Unknown Source)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.cleanupTransactions(WSRdbManagedConnectionImpl.java(Compiled Code))
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.destroy(WSRdbManagedConnectionImpl.java:2093)
at com.ibm.ejs.j2c.MCWrapper.destroy(MCWrapper.java:1397)
at com.ibm.ejs.j2c.poolmanager.FreePool.cleanupAndDestroyMCWrapper(FreePool.java:510)
at com.ibm.ejs.j2c.poolmanager.FreePool.returnToFreePool(FreePool.java(Compiled Code))
at com.ibm.ejs.j2c.poolmanager.PoolManager.release(PoolManager.java(Compiled Code))
at com.ibm.ejs.j2c.MCWrapper.releaseToPoolManager(MCWrapper.java(Compiled Code))
at com.ibm.ejs.j2c.MCWrapper.connectionErrorOccurred(MCWrapper.java:1875)
at com.ibm.ejs.j2c.ConnectionEventListener.connectionErrorOccurred(ConnectionEventListener.java:328)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.processConnectionErrorOccurredEvent(WSRdbManagedConnectionImpl.java:1448)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.fireConnectionErrorEvent(WSJdbcConnection.java:1010)
at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:899)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java(Compiled Code))
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java(Compiled Code))
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
...
Caused by: java.sql.SQLException: [IBM][CLI Driver] CLI0106E Die Verbindung ist beendet. SQLSTATE=08003DSRA0010E: SQL-Status = 08003, Fehlercode = -99.999
... 34 more
---- Begin backtrace for nested exception
java.sql.SQLException: [IBM][CLI Driver] CLI0106E Die Verbindung ist beendet. SQLSTATE=08003DSRA0010E: SQL-Status = 08003, Fehlercode = -99.999
at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(Unknown Source)
at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.check_return_code(Unknown Source)
at COM.ibm.db2.jdbc.app.DB2Connection.rollback(Unknown Source)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.cleanupTransactions(WSRdbManagedConnectionImpl.java(Compiled Code))
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.destroy(WSRdbManagedConnectionImpl.java:2093)
at com.ibm.ejs.j2c.MCWrapper.destroy(MCWrapper.java:1397)
at com.ibm.ejs.j2c.poolmanager.FreePool.cleanupAndDestroyMCWrapper(FreePool.java:510)
at com.ibm.ejs.j2c.poolmanager.FreePool.returnToFreePool(FreePool.java(Compiled Code))
at com.ibm.ejs.j2c.poolmanager.PoolManager.release(PoolManager.java(Compiled Code))
at com.ibm.ejs.j2c.MCWrapper.releaseToPoolManager(MCWrapper.java(Compiled Code))
at com.ibm.ejs.j2c.MCWrapper.connectionErrorOccurred(MCWrapper.java:1875)
at com.ibm.ejs.j2c.ConnectionEventListener.connectionErrorOccurred(ConnectionEventListener.java:328)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.processConnectionErrorOccurredEvent(WSRdbManagedConnectionImpl.java:1448)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.fireConnectionErrorEvent(WSJdbcConnection.java:1010)
at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:899)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java(Compiled Code))
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java(Compiled Code))
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
...
Ich habe die Ausschnitte aus den Konfigurationen und den Stacktrace erst mal etwas knapper gehalten, wenn jemand eine Idee hat und mehr Infos braucht bitte Bescheid geben, ich poste gerne mehr.
Vielen Dank schon mal im Voraus,
Christian