我在我的gui应用程序中使用了c3po池。我有以下配置
overrides.put("maxStatementsPerConnection", 30);
overrides.put("maxPoolSize",70);
overrides.put("checkoutTimeout", 50000);
偶尔我会遇到尝试连接超时的情况
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 com.jthink.jaikoz.db.Db.createConnection(Db.java:402)
即使我确定我没有其他联系打开。事实上,我曾经尝试过启用一些额外的选项(debugUnreturnedConnectionStackTraces
,unreturnedConnectionTimeout
)来尝试识别未关闭连接的问题并发现没有问题。这个问题很少发生,只有在运行一段时间后才会发生。我正在使用嵌入式Derby
数据库。
幸运的是,当它失败的时候我运行它Yourkit
启用了Profiler,我可以进行监控分析,发现我们有三个c3po线程都在等待,这是为什么我认为这里实际上存在僵局
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#0
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#1
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#2
这类似于numHelperThreads
的设置吗?
我采取了这个
的screendump
我是否发现了c3po的问题,我可以编码从中恢复吗?
答案 0 :(得分:1)
你看到的三个线程确实是帮助线程。这些会异步减慢JDBC操作,例如关闭未使用的连接。 stacktrace的最后一行
com.jthink.jaikoz.db.Db.createConnection(Db.java:402)
似乎表明C3P0正在尝试打开一个新连接,但数据库拒绝创建一个连接。我假设'Jaikoz'数据库拒绝连接,C3P0连接池不是问题。
西蒙