34

JDBC コーディングに関するいくつかの質問:

  1. 単一のクライアント アプリケーションの場合、接続プールは必要ですか?
  2. Connection最初に を作成し、アプリケーションが終了するまで閉じずにそのままにしておくのは良い考えですか? なんで?
  3. PreparedStatementに関連付けられているConnection場合、各クエリの後に接続が閉じられない場合は、 を有効にPreparedStatementして他の方法で再利用してみませんか?
  4. 各クエリを作成する場合PreparedStatement、データベースはそれが同じであることを認識しPreparedStatement、最初の以降の不要なアクションを無視しますか?
  5. PreparedStatement一度作成して何度も再利用するステートメントではありませんか? はいの場合、なぜ毎回閉じる必要があるのですか?

close()への呼び出しがリソースを解放することを知っています。しかし、後で使用することがわかっている場合は、なぜそれを解放して、後で再度要求するのでしょうか?

マルチクライアント アプリケーションはどうでしょうか。接続プールが必要なのでStatementPreparedStatement毎回接続を作成して閉じる必要がありますか?

4

2 に答える 2

16

個人的には、プールを使用します。これにより、すべてのリソース管理が行われるからです。接続要件が変更された場合は、プール構成を簡単に変更できます。プールを配置すると、ベストプラクティスに従って接続と準備済みステートメントを開閉し、リソース管理をプールに任せることができます。

通常、プールを使用する場合:

  • 接続を閉じると、実際にはプールに返されます
  • ステートメントを準備する行為は、以前に準備されたステートメントを Connection のステートメント キャッシュから取得するか、使用できない場合は、新しいステートメントを作成して後で使用するためにキャッシュします。
  • PreparedStatement を閉じる操作は、実際にはそれを接続のステートメント キャッシュに返すだけです。

さらに、プールの実装によっては、リソース リークが発生したときに通知できる場合があり、コード内でこの種の問題を特定しやすくなります。

DBCPのような実装例のソースを見てみましょう。それらがどのように機能するかを見るのは非常に興味深いことです。

于 2009-06-24T16:43:21.240 に答える
3

1.クライアントが 1 つしかない場合でも、接続プールが有効な場合があります。データベースへの接続にはかなりの時間がかかる場合があるため、接続を頻繁に行うと、ネットワーク リクエストが遅くなり、アプリケーションの速度が低下する可能性があります。さらに、@teabot が説明しているように、プールは接続が閉じられていないかどうかを識別するのに役立ちます。

2.接続を開いたままにしておくことは、次の 2 つの理由からお勧めできません。最初に、一時的なネットワークの中断があると、接続が切断されることがあります。開いている時間が長いほど、必要なときに死んでいる可能性が高くなります。第 2 に、トランザクションが失敗すると、操作を続行するのに適していない状態で接続が終了する可能性があります。通常、最善の方法は、いくつかの接続を開き、それらを 5 ~ 10 分間再利用してからリサイクルすることです。

3.データベースとドライバによっては、接続に準備済みステートメント キャッシュがある場合があります。異なる接続を使用している場合でも、RDBMS は通常、パラメーターを含めてまったく同じステートメントをキャッシュします。したがって、SELECT * FROM テーブル WHERE 値=? 準備されたステートメントは接続間でキャッシュされますが、 SELECT * FROM table WHERE value='your_data' のようなパラメーター値を指定すると、おそらくサーバー側にキャッシュされません。

4. 3 で説明したように、RDBMS の実装に依存するため、ベンチマークを実行します。

5.異なるパラメーターで再利用されるステートメントを閉じて再度準備する必要はありません。パラメータを再設定して実行するだけです。

複数のクライアントの場合、データベースには常に同時接続制限があり、通常はそれほど大きな数ではありません。すべてのクライアントが webapp を通過する場合、DBCP のようなプールで問題ありません。しかし、複数の接続を永続的に開いた状態でクライアントごとにプールを作成することは明らかに望ましくありません。

于 2016-12-01T14:29:00.093 に答える