在准备另一个Statement之前是否需要关闭PreparedStatement
Is it necessary to close PreparedStatement before preparing another Statement
是否需要在一次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行的代码是必须的吗?
严格来说没有必要,因为你可以同时打开多个prepared statements。 必要的是 关闭每个打开的资源,如果以后不再使用的话。
查看您的代码,它并不能确保语句实际上已关闭。
为确保这一点,每个关闭操作都必须在 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
如果您将 Java 7 与 try-with-resources 语句一起使用,则此代码可以 大大 简化:
try (PreparedStatement pstmt = conn.prepareStatement(firstsql);
ResultSet r = pstmt.executeQuery();) {
// do something with the ResultSet
}
没有。您可以同时打开多个语句。但你最终必须关闭它们。
您发布的代码无法编译,如果编译成功,就会发生资源泄漏,但这与您标题中的问题不同。
是否需要在一次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行的代码是必须的吗?
严格来说没有必要,因为你可以同时打开多个prepared statements。 必要的是 关闭每个打开的资源,如果以后不再使用的话。
查看您的代码,它并不能确保语句实际上已关闭。
为确保这一点,每个关闭操作都必须在 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
如果您将 Java 7 与 try-with-resources 语句一起使用,则此代码可以 大大 简化:
try (PreparedStatement pstmt = conn.prepareStatement(firstsql);
ResultSet r = pstmt.executeQuery();) {
// do something with the ResultSet
}
没有。您可以同时打开多个语句。但你最终必须关闭它们。
您发布的代码无法编译,如果编译成功,就会发生资源泄漏,但这与您标题中的问题不同。