2012-01-10 8 views
4

私のGUIアプリケーションでc3poプーリングを使用しました。私は私が私が開いて他の接続を持っていないと確信しているにもかかわらずc3poヘルパースレッドがデッドロックする

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) 

接続がタイムアウトを取得しようとする状況に入り込み、次のような構成

時折
overrides.put("maxStatementsPerConnection", 30); 
overrides.put("maxPoolSize",70); 
overrides.put("checkoutTimeout", 50000); 

を持っています。実際、私はいくつかの追加オプションを有効にして(debugUnreturnedConnectionStackTracesunreturnedConnectionTimeout)、接続を閉じないと問題を特定しても何の問題も見つけられませんでした。この問題はほとんど発生せず、しばらく実行した後にのみ発生します。私は組み込みのDerbyデータベースを使用しています。

今回は失敗しましたが、私はそれを実行していましたYourkitプロファイラーが有効になっていて、モニタープロファイリングを行うことができました.3つの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

のスクリーンダンプを取ったが、私はそれから回復するためにコーディングすることができ、C3POに問題を発見したことがありますか?

+0

申し訳ありませんが、c3poとは何ですか?他のロボットはスターウォーズの中にいますか? – Iznogood

+1

@Iznogood c3p0はPooledConnectionライブラリです。http://www.mchange.com/projects/c3p0/index.html –

+0

@DanWありがとう!!! – Iznogood

答えて

1

実際に表示される3つのスレッドは、ヘルパースレッドです。これらは、未使用の接続を閉じるなど、JDBC操作を非同期で遅くします。スタックトレース

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

の最後の行は、C3P0は、新しい接続をオープンしようとしていることを示していると思われるが、データベースが1を作成することを拒否します。私は 'Jaikoz'データベースが接続を拒否していると仮定し、C3P0接続プールは問題ではありません。

シモン

関連する問題