我正在连续执行一些SELECT
,我想知道如何处理PreparedStatement
。
示例代码:
//Connection conn is already declared
PreparedStatement pstmt = null;
ResultSet rset = null;
try {
String sql = "SELECT ...";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, someVar);
rset = pstmt.executeQuery();
// Use ResultSet
// A different query
sql = "SELECT ...";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, someVar);
rset = pstmt.executeQuery();
// Use ResultSet
} catch (SQLException e) {
// Handle
} finally {
if (rset != null)
rset.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
}
现在的问题是,在每次使用/使用不同的语句后关闭PreparedStatement
是否会更好或者它会完全没有区别?
我发现了一些有关重用PreparedStatement
但始终具有相同查询但仍不确定使用不同查询的信息。
答案 0 :(得分:11)
您没有使用相同的PreparedStatement
,工厂方法Connection.prepareStatement
每次调用时都会返回一个新实例。 PreparedStatement.executeQuery
对ResultSet
做同样的事情。你只是使用相同的变量。
这意味着您每次调用此方法时都会泄漏资源 - 第一个PreparedStatement
和ResultSet
,这些方法永远不会被关闭。
我的建议是使用Spring JdbcTemplate
来正确处理这些数据库资源,并将代码分解为两种方法。