Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out

当并发量大的时候,C3P0连接池会出现如下异常信息:

[java]  view plain  copy
  1. Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.  
  2. at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)  
  3. at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)  
  4. at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527)  
  5. at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)  
  6. at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)  
  7. at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)  
  8. ... 5 more  
  9. Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from -- timeout at awaitAvailable()  
  10. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317)  
  11. at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)  
  12. at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)  
  13. at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)  
  14. ... 8 more  

对于这部分的异常分析如下:

网上很多说是C3P0的bug问题。c3p0在同时关闭statement和connection的时候,或者关闭他们之间的时间很短的时候,有时候connection并没有被关闭,因为有些preparedstatement还在被cached住。这样就会有很多connection并没有真正的被关闭,连接池的连接都给耗尽了,就会产生上面的异常。解决的方案就是把缓存关闭也就是把c3p0.max_statements 设置成0,这样就不会有缓存的preparedstatement,而设置的c3p0.idle_test_period又小于c3p0.timeout,这样的设置应该没有什么问题了。

回头有时间的话,再拜读下源码研究下,目前先这么解决即可.


以上转载   jmeter  200线程 10轮压测 可以,再高300线程 压还会报出这个错误

ps :这个办法只能缓解  并发再高的

你可能感兴趣的:(性能优化)