是否有必要在一个db.getConnection()中关闭ResultSet和PreparedStatement?对于以下示例:
Connection conn = db.getConnection();
PreparedStatement pstmt = conn.prepareStatement(firstsql);
ResultSet r = pstmt.executeQuery();
// do something with the ResultSet
r.close();
pstmt.close(); // do I need close the r and pstmt here?
PreparedStatement pstmt = conn.prepareStatement(secondsql);
ResultSet r = pstmt.executeQuery();
// do something with the ResultSet again
r.close();
pstmt.close();
conn.close();
return null;
第5行和第6行的代码是否必要?
答案 0 :(得分:9)
严格来说,没有必要,因为您可以同时打开多个预准备语句。 必要的是关闭每个打开的资源,如果以后不再使用它。
查看您的代码,它并不能确保该声明实际上已关闭。
为了确保这一点,每个关闭操作必须在finally
块内完成:这样,无论操作是否成功都将执行。
示例代码:
PreparedStatement pstmt = null;
ResultSet r = null;
try {
pstmt = conn.prepareStatement(firstsql);
r = pstmt.executeQuery();
// do something with the ResultSet
} finally {
if (r != null) {
try {
r.close();
} catch (SQLException e) {
//log error
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
//log error
}
}
}
//and do it again
如果您使用带有try-with-resources语句的Java 7,则此代码可以极大简化:
try (PreparedStatement pstmt = conn.prepareStatement(firstsql);
ResultSet r = pstmt.executeQuery();) {
// do something with the ResultSet
}
答案 1 :(得分:3)
没有。您可以同时打开多个语句。但你最终必须关闭它们。
您发布的代码无法编译,如果确实存在,则会导致资源泄漏,但这与您标题中的问题不同。