【问题标题】:Is closing the connection in finalize best practice? [duplicate]是否在最终确定最佳实践中关闭连接? [复制]
【发布时间】:2012-05-21 10:24:58
【问题描述】:

可能重复:
Why would you ever implement finalize()?

我看到了一些java文件,代码如下:

public void finalize() {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
        }
    }
}
  • 是否在finalize 方法最佳实践中关闭Connection
  • 是否足以关闭Connection 还是需要同时关闭其他对象,例如PreparedStatement

【问题讨论】:

标签: java database-connection finalizer


【解决方案1】:

从 Java 7 开始,关闭资源的最佳做法是使用 try-with-resource :

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

【讨论】:

    【解决方案2】:

    不,这不是“最佳实践”,甚至不是“合格实践”。 您无法保证何时调用终结器,因此它不起作用。

    相反,您应该将资源范围限定为块,如下所示:

    try {
      acquire resource
    }
    finally {
      if (resource was acquired)
        release it
    }
    

    【讨论】:

      【解决方案3】:

      不,如果有的话,不太可能及时调用终结器。明确且肯定地清理您的资源。

      /* Acquire resource. */
      try {
        /* Use resource. */
      }
      finally {
        /* Release resource. */
      }
      

      【讨论】:

        【解决方案4】:

        得到Connection对象后,用它来执行放在try块中的PreparedStatement/Statement/CallableStatement,然后把关门之类的清理工作,和conn放在一起。

        例如:

         try{
        
            Connection conn = DriverManager.getConnection(url,username,password);
        
            PreparedStatement pStat = conn.prepareStatement("Drop table info");
        
            pStat.executeUpdate();
              }
               catch(Exception ex){
                }
        
           finally(){
        
             pStat.close();
             conn.close();
         }
        

        【讨论】:

        • 这里的变量范围不正确;这不会编译。在此示例中,调用了两个 try-finally 块,一个嵌套在另一个块中。
        猜你喜欢
        • 2012-05-21
        • 2010-10-11
        • 2013-02-16
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 2013-10-02
        • 2010-10-06
        相关资源
        最近更新 更多