2017-10-21 9 views
0

JDBC接続の場合、Javaはポート番号を持つソケットを作成し、指定されたポート番号、データベース名そしておそらく他のオプション、このリソースを閉じることは明らかに必要です。ステートメントオブジェクトによって保持されるリソースは何ですか

Statementの場合は、ResultSetと一緒に、そのリソースを閉じて閉じる必要がありますか?私は技術的に意味します。

+0

'ResultSet'については、データベースカーソルです。基本的に、データベースは必ずしもすべての結果を熱心に取り出すとは限らず、結果自体の参照の一時的なインデックスを保持し、必要に応じて検索します。 'ResultSet'を閉じるとリソースは解放されます。 'PreparedStatement'(通常は' Statement'のためのものではありません)では、サーバ上のプリペアドステートメントです。 –

+1

@PiotrWilkinなぜコメントを使って答えますか?あなたは本当の答えとしてこれを投稿している可能性があります。 –

答えて

1

リソースが実際にステートメントまたは結果セットによって保持されるかどうかは、特定のデータベースおよびドライバによって大きく異なります。

JavaのStatementには、文章のためのメモリ、タイムアウト、フェッチサイズ、バッファなどのメモリを持つ、データベースに対応する(文ハンドル)がある可能性があります。Statementの場合は常にそうとは限りませんがPreparedStatementの場合、データベース内のステートメントハンドルは通常、実行プランなどのコンパイル済みステートメントのバージョンを保持します。

Javaでステートメントオブジェクトを閉じると、データベース内のこのハンドルが解放されます。別のステートメント)、メタデータに「存在ロック」をリリースすることができます(たとえば、テーブルがまだ使用/準備中にドロップされないようにするなど)。また、Javaでステートメントを閉じると、開いている結果セットがすべて閉じられ、Javaおよびデータベース内のメモリーが解放されます。

結果セット自体を閉じると、結果セットがJavaでメモリを保持する可能性があります(プリフェッチされた行、場合によっては完全な結果)ので、結果セットを閉じるとプリフェッチされた行と空きメモリが解放されます。これは特に、結果セットを完全に読み取っていない場合、またはスクロール可能な結果セットを使用している場合に適用されます。

結果セットには、データベース側にフェッチされた最後の行を指し示すカーソル(または同様のもの)があります(たとえば、for updateのselect文で)行をロックし、メモリ内の行をフェッチします。結果セットを閉じると、メモリやロックなどが解放されます。

つまり、結果セットとステートメントを閉じる必要があります。終了するとすぐに実行する必要があります。

関連する問題