【问题标题】:Java Create statement usage in while loopJava Create语句在while循环中的使用
【发布时间】:2012-02-25 00:48:56
【问题描述】:

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

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) {  }
              }
          }
      }

【问题讨论】:

  • 顺便说一句,您可能希望至少在 finally 块中关闭连接...
  • 是的,我已经这样做了..我正在用它更新我的代码..

标签: java database jdbc


【解决方案1】:

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

如果循环使用不同的数据值做同样的事情,我更喜欢PreparedStatement 以提高速度。

【讨论】:

  • 是的,循环对不同的数据值做同样的事情。我会读到 PreparedStatement
  • PreparedStatement 对我提到的第二种情况除了性能还有优势吗?
  • @Ankur 第二种情况否定了prepared statement的优点,因为它会一遍又一遍地准备它。我们的想法是准备一次,然后根据需要在循环中多次重复使用它。
【解决方案2】:

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

【讨论】:

  • 同意 - 缓存一个准备好的语句会有很大帮助。尽管取决于事物的确切性质,声明可能可重写为单个大规模更新。
【解决方案3】:

真的,您应该使用PreparedStatement with placeholders 并且只创建一次语句,就像在您的第一个示例中一样。

【讨论】:

  • PreparedStatement 对我提到的第二种情况除了性能还有优势吗?
  • 我想不出任何正当理由来创建和丢弃 Statement 对象,就像您在第二个示例中所做的那样。您将分配不需要分配的内存,而 GC 将不得不处理它。
【解决方案4】:

我认为上述情况没有太大区别 - 如果中间有足够的工作让它长时间保持打开状态,您希望关闭该语句 - 根据文档:

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

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

【讨论】:

  • PreparedStatement 对我提到的第二种情况除了性能还有优势吗?
  • 您不想使用您提到的 PreparedStatement 的第二种方式。 PreparedStatements 的想法是尽可能多地重用它们,多次创建它们只会减少好处。除了性能之外应该没有其他好处,而且只有在您有多次调用的情况下。
  • 不,我的意思是使用我在第二种情况下描述的 CreateStatement 或第一种情况下的 PreparedStatement。除了性能之外,PreparedStatement 还有其他优势吗?
  • 性能和参数。参数允许您使用不同的参数多次运行相同的 SQL,而无需 a) 自己构建 SQL(例如连接字符串)和 b) 增加一定程度的安全性(自动转义 - 例如避免 SQL 注入、自动值转换 - 例如日期根据需要在最终 SQL 中表示,等等)。
  • 如果你循环 20k 次,创建并丢弃 20k 个对象到 GC 会有很大的不同。实际上没有理由这样做。
【解决方案5】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2017-05-02
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多