Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当方法终止时,是否有必要关闭连接和语句?_Java_Jdbc - Fatal编程技术网

Java 当方法终止时,是否有必要关闭连接和语句?

Java 当方法终止时,是否有必要关闭连接和语句?,java,jdbc,Java,Jdbc,在JDBC文学中,我经常遇到这样的片段 void databaseCall() { Connection con = null; Statement statement = null try { con = getConnection(...); statement = con.createStatement(...); // do some query

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

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

不,它们不会被关闭

如果
getConnection()
创建了一个新的连接,那么在方法结束时唯一会发生的事情就是该连接可能会被垃圾收集。但是GC不会为您调用close()方法。而且,不管怎样,你想尽快结束

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


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

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

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