c3po辅助线程将死锁

时间:2012-01-10 20:25:23

标签: java database derby c3p0

我在我的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)

即使我确定我没有其他联系打开。事实上,我曾经尝试过启用一些额外的选项(debugUnreturnedConnectionStackTracesunreturnedConnectionTimeout)来尝试识别未关闭连接的问题并发现没有问题。这个问题很少发生,只有在运行一段时间后才会发生。我正在使用嵌入式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

enter image description here

我是否发现了c3po的问题,我可以编码从中恢复吗?

1 个答案:

答案 0 :(得分:1)

你看到的三个线程确实是帮助线程。这些会异步减慢JDBC操作,例如关闭未使用的连接。 stacktrace的最后一行

com.jthink.jaikoz.db.Db.createConnection(Db.java:402)

似乎表明C3P0正在尝试打开一个新连接,但数据库拒绝创建一个连接。我假设'Jaikoz'数据库拒绝连接,C3P0连接池不是问题。

西蒙