0

接続プールとして3cp0を使用してプログラムを30分ほど実行すると、次の例外が発生します。

エラーは次のとおりです。

   [java]  INFO [Timer-0] (BasicResourcePool.java:1392) - A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@eaecb09
    [java] The last packet successfully received from the server was 375,017 milliseconds ago.  The last packet sent successfully to the server was 9 milliseconds ago.
    [java] Exception in thread "main" java.lang.NullPointerException
    [java]  at com.mytest.myorg.MyProg.MyProgRunner.main(MyProgRunner.java:104)

そして私はこのように私のプールを設定しています:

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver            
cpds.setJdbcUrl( "jdbc:mysql://"+hostname+"/"+database );
cpds.setUser(username);                                  
cpds.setPassword(password);  
cpds.setMinPoolSize(5);                                     
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(15);
cpds.setAutoCommitOnClose(true);
cpds.setIdleConnectionTestPeriod(300);
cpds.setMaxStatements(180);
cpds.setNumHelperThreads(20);
cpds.setUnreturnedConnectionTimeout(300);

ページをクロールする100個のスレッドがあり、次に結果をデータベースに挿入する15個のDBスレッドがあります。クロールタスクに20秒以上かかる場合は、スレッドを強制終了します。データベース接続プールが停止する理由はありますか?

ありがとう

4

2 に答える 2

4

c3p0 を使用する場合、c3p0.properties ファイルで初期化する必要のあるプロパティがいくつかあります。それらのうち、c3p0.unreturnedConnectionTimeoutという名前のプロパティが 1 つあります。

その値は秒単位です。一部のクエリが指定された期間内に結果を返さなかった場合 (c3p0.properties ファイルの c3p0.unreturnedConnectionTimeout プロパティに指定したとおり)、現在のセッションは破棄され、新しいセッションがセッション プールから取り出されますが、コードは動作しています。すでに破棄されている前のセッション。したがって、コードはsession is alredy closed Exceptionをスローします

そのため、クエリにかかる最大時間を調べ、それに応じてこのプロパティ値を設定する必要があります。

乾杯

于 2013-07-15T09:06:36.983 に答える
0

このフォーラムの投稿が役立つかもしれません: http://old.nabble.com/A-checked-out-resource-is-overdue--td20545738.html#a20575081

強制終了されたスレッドの場合、接続はプールに戻されますか?

于 2010-07-22T21:32:21.760 に答える