The behavior of resultsets and (prepared) statements is explicitly documented in the Java API. I suggest that you read the actual documentation (and the JDBC spec) to get the details.
The Statement
API says:
By default, only one ResultSet
object per Statement
object can be open at the same time. Therefore, if the reading of one ResultSet
object is interleaved with the reading of another, each must have been generated by different Statement
objects. All execution methods in the Statement
interface implicitly close a current ResultSet
object of the statement if an open one exists.
(emphasis mine).
In your specific code, when you call aStmt.executeQuery()
, the old ResultSet
assigned to aRset
is implicitly closed by the driver. That said, it would be better to explicitly close it yourself (or use Java 7 try-with-resources), to prevent you from forgetting to close the ResultSet
in the last iteration through the loop.
Now to the PreparedStatement
: When you prepare a statement (in general, implementation can vary), the query is sent to the server for compilation. On execution the parameters for that specific execution is sent to the server. Calling close()
on aStmt
would result in the prepared statement being deallocated on the server, that is clearly NOT what you want here as you want to re-use the statement with different values for its parameter.
So in short
- Closing
ResultSet
is not technically necessary here (except for the last ResultSet
created), but it is better to do it explicitly
- You should only close the
PreparedStatement
when you are done with it.
Using try-with-resources is one way to remove part of the confusion on these issues, as your code will automatically release resources when it is done with it (at the end of the scope of use):
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
}
}
}
At the end of this piece of code all JDBC resources are correctly closed (in the right order, even if exceptions occurred etc)