2

私の webapp では、頻繁に例外が発生します

org.hibernate.util.JDBCExceptionReporter: SQL Error: 17002, SQLState: 08006
        14 Sep 2013 12:19:10,927 [ERROR] org.hibernate.util.JDBCExceptionReporter: IO Error: Connection reset
        14 Sep 2013 12:19:10,927 [ERROR]  could not load an entity: [EntityName]
    nested exception is org.hibernate.exception.JDBCConnectionException: could not load an entity: [EntityName]

...

14 Sep 2013 12:19:10,930 [WARN]  (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) com.mchange.v1.db.sql.StatementUtils: Statement close FAILED.
java.sql.SQLRecoverableException: Closed Connection
    at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5389)
    at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1578)
    at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563)
    at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.close(OraclePreparedStatementWrapper.java:80)
    at com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:41)
    at com.mchange.v2.c3p0.stmt.GooGooStatementCache.synchronousDestroyStatement(GooGooStatementCache.java:413)
    at com.mchange.v2.c3p0.stmt.GooGooStatementCache.closeAll(GooGooStatementCache.java:351)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.closeAllCachedStatements(NewPooledConnection.java:673)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:543)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)
    at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

C3P0 の設定を変更しようとしましたが、解決しません

これが私の現在の構成です:

checkoutTimeout     10000   
idleConnectionTestPeriod        0
initialPoolSize     10  
maxIdleTime     28800   
maxPoolSize     20  
minPoolSize     8   
numHelperThreads        5
testConnectionOnCheckin     true

関連コード: HibernateTemplate の get メソッドへの単純な呼び出しです

Object result = getHibernateTemplate().get(entityClass, id);
return (T) result;
4

1 に答える 1

2

たくさん試したように聞こえますが、testConnectionOnCheckin を使用している場合は、それをゼロ以外の短い idleConnectionTestPeriod と組み合わせる必要があります。パフォーマンスのために、preferredTestQuery も設定する必要があります。

信頼性の低い接続テストが問題であるかどうかを確認する最も簡単な方法は、testConnectionOnCheckin から testConnectionOnCheckout に切り替えることです (そして、パフォーマンスへの影響を最小限に抑えるために preferredTestQuery を追加します)。これで問題が解決する場合は、適切な接続テストが必要であることがわかります。元に戻って、idleConnectionTestPeriod の長さをいじることができます。testConnectionOnCheckout で問題が解決しない場合は、接続テストの問題である可能性は低いです。testConnectionOnCheckout は非常に信頼できる設定です。

見る

http://www.mchange.com/projects/c3p0-0.9.5-pre4/#simple_advice_on_connection_testing http://www.mchange.com/projects/c3p0-0.9.5-pre4/#configuring_connection_testing

于 2013-09-14T13:27:29.753 に答える