21

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

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

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

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

4

2 に答える 2

18

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

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

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

于 2012-12-24T18:03:50.220 に答える
4

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

データビー/ドライバーがどのように破損する可能性があるか(たとえば、リソースリークがある可能性があります)はわかりません。したがって、ベストプラクティスの推奨事項は、すべてを明示的に閉じることです。

于 2012-12-24T17:55:05.870 に答える