2012-12-24 12 views
18

Javaの安全なパターンは、finallyブロックでResultSet、Statement、Connectionを順番に閉じることです。Connectionを閉じると、ステートメントと結果セットは自動的に閉じますか?

接続を終了してから、文をクローズしようとすると(例外は発生しません)。しかし、文からメソッドを呼び出そうとすると、例外がスローされます。

私はその接続から作成されたすべてのステートメントオブジェクトを自動的に閉じて閉じるのだろうかと思っていましたか?

アップデート:私はDatabaseProductVersion使用しています
:Oracle Database 11gリリースを11.1.0.0.0
にDriverName:OracleのJDBCドライバ
DriverVersion:10.2.0.4.0

+2

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection –

答えて

14

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

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

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

+2

よく書かれた接続プールは、関連する基礎リソース(その他接続が閉じているときは接続自体よりも)。うまく書かれたクライアントコードはそれに依存すべきではありません。実際には、ほとんどのことがひどく書かれています。あなたのコードがバラの香りを思いつくのは良い習慣です。 –

+1

右。私はApacheのBasicDataSourceでテストすることに決めました。私はconnをオープンし、stmtを作成し、connをクローズし、queryを実行しました。 "[email protected]"が閉じられました " –

+0

" JDBCを直接使用するのは良いアイデアではありません "なぜそうではありませんか?Springは場合によっては便利かもしれませんが、 –

2

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

どのような方法でデータベース/ドライバが壊れる可能性があるかはわかりません(リソースリークなど)。したがって、明示的にすべてを閉じることをお勧めします。

関連する問題