Java 当方法终止时,是否有必要关闭连接和语句?
在JDBC文学中,我经常遇到这样的片段Java 当方法终止时,是否有必要关闭连接和语句?,java,jdbc,Java,Jdbc,在JDBC文学中,我经常遇到这样的片段 void databaseCall() { Connection con = null; Statement statement = null try { con = getConnection(...); statement = con.createStatement(...); // do some query
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.类似于您的疑问得到了解释