web-dev-qa-db-ja.com

Connectionを閉じると、ステートメントと結果セットが自動的に閉じますか?

Javaの安全なパターンは、finallyブロックでResultSet、Statement、およびConnectionを順に閉じることです。

接続を閉じてからステートメントを閉じようとした場合(例外をスローしません)。しかし、ステートメントからメソッドを呼び出そうとすると、例外がスローされます。

接続を閉じると、その接続から作成されたすべてのステートメントオブジェクトが自動的に閉じられるのでしょうか。

更新:
私はDatabaseProductVersionを使用しています:Oracle Database 11gリリース11.1.0.0.0
DriverName:Oracle JDBCドライバー
DriverVersion:10.2.0.4.0

20

そうです、Connection.close APIは、「このConnectionオブジェクトのデータベースとJDBCリソースが自動的に解放されるのを待つのではなく、ただちに解放する」と述べています。問題は、アプリケーションが通常データベース接続プールを使用し、これらが単にConnection.closeでプールに接続を返す可能性があることです。

いずれの場合も、常にResultSetとStatementを明示的に閉じ、Connection.closeに依存しないことをお勧めします。

また、JDBCを直接操作することは最善の方法ではありません。代わりにSpring JDBCを使用して、リソースの問題の解放を忘れることができます。

17

詳細は最終的には各JDBCドライバー実装にまで及びます。ただし、データベースへの接続が閉じると、それに関連するすべてがDB側で破棄されるため、これらのリソースを表すオブジェクトを自動的に閉じる以外にクライアント側でできることはほとんどありません。

データベースやドライバがどのように破損する可能性があるか(たとえば、リソースリークが発生する可能性があるなど)はわからないため、すべてを明示的に閉じることをお勧めします。

3
Marko Topolnik