准备好的声明初始化了tiwice并关闭了一次

时间:2010-05-19 06:58:13

标签: prepared-statement

我想知道,如果PreparedStatement对象的初始化方式是下面代码片段中显示的两倍,并且在finally块中只关闭一次,它是否会无法关闭?我没有在此代码中收到任何错误,但最好使用2个不同的preparedStatements而不是一个。我认为它无法在#1处关闭preparedStatement。

    Connection conn = null;
 PreparedStatement ps = null;
 try {
  conn = getConnection();
  ps = conn.prepareStatement(QueryUtil.UPDATE_POLICY_DETAILS); // #1
  ps.setInt(1, iCancellationPolicyId);
  ps.executeUpdate();

  //some code here


  ps = conn.prepareStatement(QueryUtil.UPDATE_POLICY_CHARGES); // #2
  ps.setInt(1, iCancellationPolicyId);
  ps.executeUpdate();


  //some code here


 } catch (SQLException sqlExp) {
  sqlExp.printStackTrace();
  LOG.fatal(sqlExp);
 } finally {
  ps.close();
  conn.close();

 }

2 个答案:

答案 0 :(得分:1)

使用两个不同的预备语句...只是你只使用一个变量。第二次调用prepareStatement的结果被分配给ps,之后您再也没有参考第一个准备好的语句了。

我的一部分认为您应该使用两个单独的变量并分别关闭每个语句。我的另一部分想知道关闭连接是否会自动关闭与连接相关的所有准备好的语句......虽然我看不出任何保证。

我认为最强大的方法确实是使用两个不同的变量。理想情况下,您还应该关闭自己的finally块中的每个项目 - 否则,如果第一个close调用抛出,您将跳过下一个。

答案 1 :(得分:0)

我在这里看到了一些东西。

<击>

首先,您只需使用相同的值重新分配ps的值。所以第二个conn.prepare是多余的,可以消除。

第二,您可能需要考虑是否需要准备。通常,您准备一个多次使用的命令。我怀疑准备2次使用的效率低于简单执行命令。

我错了。

编辑:我错了。我误读了命令值。所以,是的,您可能希望使用离散变量来确保它们正确关闭。

但我认为关于准备的观察是正确的。