1

在 JDBC literatur 我经常遇到像这样的片段

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块完成时。块中的close语句finally真的有必要吗?即使我们没有显式释放资源,当方法完成时它们不会以任何方式关闭吗?

4

2 回答 2

4

不,他们不会被关闭。

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

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

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

于 2012-08-01T11:24:40.533 回答
-2

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

于 2015-06-18T09:48:53.077 回答