12

プログラムでこれらの ResultSet と Connection のインスタンスを使用する必要がなくなった場合、両方で .close() メソッドを呼び出す必要があるのはなぜですか?

そうしないことの危険性は(もしあれば)何ですか?

4

4 に答える 4

12

ここで 2 つの質問があります。

データベース接続

データベース接続を開いたままにすると、データベースのリソースが消費されます。メモリを使用し、データベースは最大接続数を持つように構成されているため、接続が不足する可能性が高くなります。また、セッションの状態が維持されるため、ロックが意図した範囲を超えて誤って保持されるという問題が発生する可能性があります。

良い面としては、プリペアド ステートメントはコンパイルされたまま使用できる状態に保たれるため、SQL を正しくコーディングして使用すれば、プリペアド ステートメントを再利用することでパフォーマンスを大幅に向上させることができます。ただし、これを行うとコードが複雑になる可能性があるため、注意が必要です。

また、接続の取得には非常にコストがかかるため、接続プールが存在します。これらは接続を開いたままにしますが、クライアントは接続を取得して使用し、完了したら解放してプールに戻します。

結果セット

結果セットを開いたままにしておくと、そうでない場合は特定のロックも開いたままになりますcommit(結果セットが閉じられます)。したがって、アプリケーションによっては、すぐにデッドロックや重大な活性の問題が発生する可能性があります。接続を開いたままにするかどうかに関係なく、できるだけ早く結果セットを閉じて、できるだけ多くのリソースをデータベースに解放します。

于 2012-07-31T00:59:15.280 に答える
7

*.close()オブジェクト インスタンスが保持しているリソースへの参照を解放できるようにします。

の場合、ResultSetこれは他のオブジェクトのかなりの数になる可能性があります。GC は最終的にそれらをクリーンアップするために取り掛かります - ResultSet. 入るのは良い習慣です。

Connectionオブジェクトは、接続に関連付けられたリソースを保持します。Connectionこの場合、GC がそれらのリソースを直接回復することはありません (メソッドを実装している場合は間接的に発生する可能性がありfinalizeます)。*.close()限られた性質のリソースを保持している可能性があるものは何でもしたいので、それらのリソースを再利用できます。

たとえば、接続数に上限があることは珍しくありません。これらのリソースをできるだけ早く解放すると、応答が向上し、失敗の可能性が低くなります。

どちらの場合も、閉じるコードの全体的な応答性が向上する可能性があります。それは良い賭けです。

于 2012-07-31T00:52:09.807 に答える
2

JDBC 接続を閉じないことにより、接続プーリングが使用されている場所で、アイドル状態の JDBC 接続がリープされるのを長時間待機する可能性が高くなります。JDBC 接続を閉じると、再利用が速くなり、パフォーマンスが向上します。

結果セットを閉じないと、一部のデータベースでカーソル リソースが解放されない可能性があります。

于 2012-07-31T00:49:06.217 に答える
0

結果セット オブジェクトを閉じていない場合、コードを長時間実行するとメモリ不足エラーが発生する可能性があります。閉じるのに失敗したときにメモリ不足エラーに直面し、結果セットの参照をnullとして直接作成しました。MySQLデータベースを使用しました。

于 2015-07-19T11:41:17.637 に答える