Java在while循环中创建语句用法

时间:2012-02-25 00:48:57

标签: java database jdbc

以下哪项是正确的(或者是否重要)。

Connection conn = null;
conn = DriverManager.getConnection (url, userName, password);
Statement st = conn.createStatement();
while (a.b()) {

  st.executeUpdate(blah blah); // same statement with different data values

}
st.close();
conn.close();





 finally
          {
              if (conn != null)
              {
                  try
                  {
                      conn.close ();
                  }
                  catch (Exception e) {  }
              }
          }
      }

Connection conn = null;
conn = DriverManager.getConnection (url, userName, password);
while (a.b()) {
  Statement st = conn.createStatement();
  st.executeUpdate(blah blah); //same statement with different data values
  st.close();
}
conn.close();




  finally
          {
              if (conn != null)
              {
                  try
                  {
                      conn.close ();

                  }
                  catch (Exception e) {  }
              }
          }
      }

5 个答案:

答案 0 :(得分:2)

如果循环内的更新重用完全相同的语句,则首选表单。相反,如果语句随着每次迭代而改变,那么你就会陷入第二种形式。

答案 1 :(得分:2)

实际上,您应该使用PreparedStatement with placeholders并且只在第一个示例中创建一次语句。

答案 2 :(得分:2)

在循环之外创建语句更简洁,可能会更快,但您需要进行分析以查看它是否会对您的情况产生很大影响。

如果循环使用不同的数据值做同样的事情,我希望PreparedStatement获得速度。

答案 3 :(得分:2)

我不认为上述情况会有很大的不同 - 如果有足够的工作让它长时间保持开放,你想关闭声明 - 如根据文件:

  

立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,最好在完成资源后立即释放资源,以避免占用数据库资源。

除非您的SQL发生更改,否则最好使用PreparedStatement,而不是使用您指定的第一种方式。

答案 4 :(得分:1)

两者都不正确。假设您没有重复执行完全相同的查询,但它们具有不同的值,那么您应该使用(单个)PreparedStatement,其查询具有占位符并在每次循环迭代时提供不同的值。

在Java端使用预准备语句会更有效(通过减少对象创建和GC成本)。它还可以减少数据库端的负载,具体取决于JDBC驱动程序的工作方式。

另一点是您需要在finally的{​​{1}}子句中关闭PreparedStatement和Connection。如果不这样做并抛出异常,那么您的代码将泄漏数据库连接。这可能会在以后引起问题。