方法终止时是否需要关闭连接和语句?

时间:2012-08-01 11:08:28

标签: java jdbc

在JDBC文学中,我经常会遇到像

这样的片段
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将在方法完成时关闭,即tryclose时1}}块完成。 finally块中的{{1}}语句是否真的有必要?即使我们没有明确释放资源,当方法完成时它们是否会以任何方式关闭?

2 个答案:

答案 0 :(得分:4)

不,他们不会被关闭。

如果getConnection()创建了一个新的Connection,那么在该方法结束时唯一会发生的事情就是可以对Connection进行垃圾回收。但是GC不会为你调用close()方法。而且,无论如何,你想尽快关闭。

大多数情况下,getConnection()只会从连接池中获得连接,这些连接会保持打开状态很长时间。如果您没有close()该连接,它将不会被放回可用连接池中,几秒钟或几分钟后,您将无法再使用任何连接。

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

答案 1 :(得分:-2)

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