【问题标题】:Is it necessary to close connection and statement when method terminates?方法终止时是否需要关闭连接和语句?
【发布时间】:2023-03-27 04:06:01
【问题描述】:

在JDBC文献中我经常遇到sn-ps之类的

void databaseCall() {
    Connection con = null;
    Statement statement = null        
    try {      
          con = getConnection(...);    
          statement = con.createStatement(...);        
          // do some query
    } catch (SQLException e) {
         // bla bla
    } finally {
         try {con.close();} catch (Exception e1) {}
         try {statement.close();} catch (Exception e1) {}
    }
}

我知道明确关闭连接和语句是最佳实践,但在这种情况下,显然资源 constatement 将在方法完成时关闭,即当 try 块完成时. finally 块中的 close 语句真的有必要吗?即使我们没有显式释放资源,当方法完成时它们不会以任何方式关闭吗?

【问题讨论】:

  • 您应该将close() 调用放入finally 块中。是的,如果您没有正确关闭资源,即使客户端程序已经完成,一些 DBMS 也会保留一些东西。
  • @G.Z.类似于您的疑问正在解释here

标签: java jdbc


【解决方案1】:

不,他们不会关闭。

如果getConnection() 创建了一个新的连接,那么在方法结束时唯一会发生的事情就是连接可能会被垃圾回收。但是 GC 不会为您调用 close() 方法。而且,无论如何,您希望尽快关闭。

大多数时候,getConnection() 只会从连接池中获取一个连接,这些连接会长时间保持打开状态。如果您不close() 连接,它将不会被放回可用连接池中,并且在几秒钟或几分钟后,您将不再有任何可用连接。

标题询问System.exit(),但问题正文没有。如果您调用System.exit(),则连接将最终关闭,因为数据库会注意到通信中断。但程序启动、执行查询和退出的情况极为罕见。大多数应用程序启动并保持运行数天甚至数月。所以你真的很想在用完后释放连接。

【讨论】:

    【解决方案2】:

    假设您为 ekart 应用程序带来了 20 个连接。这意味着连接池只有 20 个连接。如果您向服务器发送请求,池为每个请求提供一个连接。如果您不关闭连接,则在第 20 个请求后您会得到 ' OutOfConnectionError',即使您无法处理此错误并且无法发送请求,因为没有连接。如果您关闭连接,则只有您可以发送新请求............

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 2013-09-20
      • 2013-03-04
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多