結果セットと (準備された) ステートメントの動作は、Java API で明示的に文書化されています。詳細については、実際のドキュメント (および JDBC 仕様) を読むことをお勧めします。
Statement
API は次のように述べています。
デフォルトでは、ResultSet
オブジェクトごとに 1 つのオブジェクトのみStatement
を同時に開くことができます。したがって、あるResultSet
オブジェクトの読み取りが別のオブジェクトの読み取りとインターリーブされる場合、それぞれが異なるStatement
オブジェクトによって生成されたに違いありません。インターフェイス内のすべての実行メソッドは、開いStatement
ているステートメントの現在のオブジェクトが存在する場合、そのオブジェクトを暗黙的に閉じResultSet
ます。
(強調鉱山)。
特定のコードでは、 を呼び出すaStmt.executeQuery()
と、古いResultSet
割り当て先aRset
がドライバーによって暗黙的に閉じられます。とは言ってもResultSet
、ループの最後の反復で を閉じるのを忘れないようにするには、自分で明示的に閉じる (または Java 7 の try-with-resources を使用する) 方がよいでしょう。
PreparedStatement
ステートメントを準備すると (一般に、実装はさまざまです)、クエリがコンパイルのためにサーバーに送信されます。実行時に、その特定の実行のパラメーターがサーバーに送信されます。close()
onを呼び出すと、サーバー上で準備されたステートメントの割り当てが解除されます。パラメーターに異なる値を指定してステートメントを再利用する必要があるためaStmt
、これは明らかにここで必要なことではありません。
要するに
- ここで閉じる
ResultSet
ことは技術的には必要ありませんが (最後に作成されたものを除くResultSet
)、明示的に行う方がよいでしょう
PreparedStatement
作業が完了したときにのみ閉じる必要があります。
try-with-resourcesを使用することは、これらの問題に関する混乱の一部を解消する 1 つの方法です。これは、コードの使用が完了すると (使用範囲の終了時に)、コードが自動的にリソースを解放するためです。
try (
ResultSet cRset = cStmt.executeQuery(cQuery);
PreparedStatement aStmt = aConn.prepareStatement(aQuery);
) {
while (cRset.next()) {
//stuff to determine value of parm1
aStmt.setString(1, parm1);
try (ResultSet aRset = aStmt.executeQuery()) {
//more stuff
}
}
}
このコードの最後で、すべての JDBC リソースが正しく閉じられます (例外が発生した場合でも、正しい順序で)