2

この質問に対する正確な答えを見つけることができませんでした。C3P0 を使用していComboPooledDataSourceます。これらの方法論のうち、より良い方法はどれですか:

dataSource = connectionClass.getDataSource();
conn = dataSource.getConnection;
executeQuery(query1, conn);
executeQuery(query2, conn);
...
executeQuery(finalQuery, conn);
conn.close();

また

executeQuery(query1);
executeQuery(query2);
...
executeQuery(finalQuery);

ここでexecuteQuery:

conn = dataSource.getConnection;
st = conn.createStatement();
rs = executeQuery(query);
conn.closed();

要するに、かなりの量のクエリを頻繁に実行する必要があります。バッチごとに 1 回接続を取得し、それを引数として渡す最初の設計を使用することをお勧めします。それとも、2 番目のアプローチを使用して、executeQuery メソッドを呼び出すたびに接続を取得する方がよいでしょうか。私が使用していた場合DriverManagerは、明らかに最初の方法を選択します (接続を 1 回だけ取得します) が、C3P0 パッケージを使用する場合、それが正しい方法であるかどうかはわかりません。それとも、そのようなパッケージでは問題ありませんか?

4

2 に答える 2

2

接続プールを使用すると、2 番目の方法を使用しても、プールされた接続を元に戻すのにほとんど時間がかからないため、違いは無視できます。それでも、最初のアプローチを使用する方が良い方法です。

  • プールから接続を取得する追加の (わずかな) オーバーヘッドを回避します。

  • 後でトランザクションを導入する必要がある場合 (すべての変更を行うか、エラーが発生した場合は便利かつ安全に変更をロールバックする)、最初のアプローチが唯一の選択肢です。

于 2013-08-13T12:48:33.927 に答える
1

いくつかのコメント/提案

  • アプリケーションがシングル スレッドの場合 (言及しない限り)、問題はありません。接続プールを使用するかどうかは問題ではありません。単一の接続を使用し、同じものを必要な場所で関数に渡すだけです。
  • 接続プールは、ユース ケースに複数のデータベース接続が同時に含まれる場合に役立ちます。
  • アプリケーションはバッチでシングル スレッドであるため、接続プールの使用は保証されません。
  • アプリケーションに関しては、両方のアプローチは同等です。プールされたデータソース接続で connection.close() を呼び出すと、実際には閉じられず、プールに返されます。
于 2013-08-13T12:46:34.773 に答える