1

スクリプトから数分ごとに呼び出される Java アプリケーションがあります。フローは次のとおりです。

  1. スクリプトは、数分ごとに Java プロセスを呼び出します。
  2. Java プログラムは数分間 (場合によってはそれより短い時間) 実行され、いくつかの処理を行い、完了すると System.exit(0) を呼び出して終了します。
  3. ステップ 2 では、処理を行うために、c3p0接続プールを使用して MySQL DB に接続します。

プールから接続を取得するたびに、 を呼び出しますclose()。また、接続が長すぎるか閉じられていない場合はいつでも c3p0 が処理するようにunreturnedConnectionTimeout設定しました。20

私の質問は、ステップ 2 のすべての処理が完了したら、 を呼び出して終了する前にSystem.exit(0)、接続プールのクリーンアップを行う必要があるかということです。

接続プールで呼び出すclose()と、接続がプールに返されるだけで、実際に接続を「閉じる」ことはありません。終了する前に、接続プールのクリーンアップを行う必要がありますか? クリーンアップを行わずに JVM を終了した場合、DB への接続はまだ残っていますか、それとも c3p0 がそれらをクリーンアップ/強制的に閉じますか? ありがとう!

4

1 に答える 1

2

com.mchange.v2.c3p0.PooledDataSource(例: )のインスタンスを使用している場合はcom.mchange.v2.c3p0.ComboPooledDataSource、メソッド を使用できますcom.mchange.v2.c3p0.DataSources.destroy()

この方法:

C3P0 DataSource によって保持されているリソース (スレッドとデータベース接続) をすぐに解放します。

poolingDataSource() メソッドによって作成された DataSource のみが、メモリ以外のリソースを保持します。プールされていない DataSource でこのメソッドを呼び出すと、事実上ノーオペレーションになります。

このライブラリによって作成された別の DataSource にラップされているプールされた DataSource を破棄すると、外側の DataSource とラップされた DataSource の両方が破棄されると安全に推測できます。明示的に破棄するために、ネストされた DataSource への参照を保持する理由はありません。

PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do

DataSources.destroy(dataSource);
System.exit(0);

別の方法では (繰り返しますが、 のインスタンスを使用している場合com.mchange.v2.c3p0.PooledDataSource)、メソッドは次のようになりcom.mchange.v2.c3p0.PooledDataSource.html#hardReset()ます。

この DataSource に関連付けられているすべてのプールされ、チェックアウトされた接続を直ちに破棄します。PooledDataSource は、最初の Connection の取得前の初期状態にリセットされ、まだアクティブなプールはありませんが、要求の準備ができています。

PooledDataSource dataSource = new ComboPooledDataSource();
// everything you do

dataSource.hardReset();

System.exit(0);

この方法dataSource.close()はより明白であるため、最良の選択です。リソースを閉じることを常にお勧めします。接続はデータベースでしばらく開いたままになる場合がありますが、タイムアウト後に閉じます。この動作は、データベース ベンダーによって異なります。

于 2013-09-10T21:22:40.883 に答える