2012-01-10 185 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