2

現在、次の基本構造のjdbcコードがあります。

接続を取得

(次の 4 行を数回実行し、ステートメントを閉じないでください)
ステートメントを
取得 結果セットを取得 結果セットを
処理 結果セットを
閉じる

接続を閉じる

このコードを書いた後、ステートメントを閉じる必要があることに気づきました。
1 ステートメントを閉じないことの影響は何ですか。
2 次のように動作しますか? この si ステートメントを閉じると、結果セットを通常どおり処理できなくなりますか?

接続を取得

(次の 5 行を数回実行)
get statement
get result set
close statement
process result set
close result set

接続を閉じる

4

3 に答える 3

7

閉じる動作はJDBC 仕様で指定されています。接続を閉じると、接続に関連付けられているすべての JDBC リソースが解放され、すべてのステートメント、ResultSet などが暗黙的に閉じられます。ステートメントを閉じると、ResultSet が閉じられます。

例 2 の動作は保証されていません。ResultSet が使用された後、ステートメントを閉じる必要があります。仕様では、その ResultSet を使用しようとすると SQLException が発生するはずです (一部の JDBC ドライバーは仕様に厳密に従っていません。MS は最大の違反者ではありません)。

ResultSet または Statement を閉じるのを忘れると、さらに悪いケースとして、データベースと JVM リソースを必要以上に長く消費することになります。リソースが制限されているシステムや高負荷のシステムでは、これによりメモリ/接続/リソース エラーが発生したり、パフォーマンスが低下したりする可能性があります。

于 2008-10-31T21:17:59.990 に答える
3

残念ながら、答えは JDBC ドライバーによって異なります。あなたがそこに書いたことはうまくいくかもしれません。

ただし、原則として、対応する結果セットの処理が完了したときにのみステートメントを閉じます。

編集:ステートメント/結果セットなどを閉じないことの影響について尋ねた2番目の質問があったことを認識しています。影響は JDBC ドライバーにも依存しますが、重大なリソース リークにつながる可能性があります。

于 2008-10-31T19:26:31.493 に答える
1

Oracle を使用していて、ステートメントを閉じるのを忘れると、次のようになります。

ORA-01000: maximum open cursors exceeded

しばらくして。

于 2008-11-10T20:45:12.033 に答える