连续PreparedStatement良好做法

时间:2011-08-30 15:09:41

标签: java mysql jdbc

我正在连续执行一些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但始终具有相同查询但仍不确定使用不同查询的信息。

1 个答案:

答案 0 :(得分:11)

您没有使用相同的PreparedStatement,工厂方法Connection.prepareStatement每次调用时都会返回一个新实例。 PreparedStatement.executeQueryResultSet做同样的事情。你只是使用相同的变量。

这意味着您每次调用此方法时都会泄漏资源 - 第一个PreparedStatementResultSet,这些方法永远不会被关闭。

我的建议是使用Spring JdbcTemplate来正确处理这些数据库资源,并将代码分解为两种方法。