C 3 p 0使用時に発生する異常および解決策

1727 ワード

コンカレント量が大きい場合、C 3 P 0接続プールには次のような異常情報が表示されます.
Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
... 5 more
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
... 8 more

この部分の異常分析は以下の通りです.
ネット上ではC 3 P 0のバグ問題と言われています.c 3 p 0はstatementとconnectionを同時に閉じる場合、あるいは彼らの間を閉じる時間が短い場合、connectionは閉じられていない場合があります.preparedstatementの中にはcachedに住んでいるものもあります.これにより,多くのconnectionが本格的に閉じられず,接続プールの接続が枯渇し,上の異常が発生する.解決策はキャッシュを閉じること、つまりc 3 p 0.max_statementsを0に設定すると、キャッシュされたpreparedstatementがなく、c 3 p 0.idle_が設定されます.test_periodはc 3 p 0.timeoutよりも小さく、このような設定には問題はないはずです.
後で時間があれば、ソースコードの研究を読んで、今のところこのように解決すればいいです.