2012-01-10 131 views
4

我用我的gui应用程序使用c3po池。我有以下的配置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

我注意到了这

enter image description here

一个screendump我有没有发现C3PO一个问题,我可以编写歇着吧?

+0

对不起,c3po是什么?除了星球之外的其他机器人呢? – Iznogood 2012-01-10 20:27:45

+1

@Iznogood c3p0是一个PooledConnection库:http://www.mchange.com/projects/c3p0/index.html – 2012-01-10 20:29:28

+0

@丹伟感谢! – Iznogood 2012-01-10 20:31:38

回答

1

你看到的三个线程确实是辅助线程。这些操作会异步缓慢JDBC操作,例如关闭未使用的连接。堆栈跟踪

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

的最后一行似乎表明C3P0试图打开一个新的连接,但数据库拒绝创建一个。我假设'Jaikoz'数据库拒绝连接,C3P0连接池在这里不是问题。

Simon