在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
和close
时1}}块完成。 finally
块中的{{1}}语句是否真的有必要?即使我们没有明确释放资源,当方法完成时它们是否会以任何方式关闭?
答案 0 :(得分:4)
不,他们不会被关闭。
如果getConnection()
创建了一个新的Connection,那么在该方法结束时唯一会发生的事情就是可以对Connection进行垃圾回收。但是GC不会为你调用close()方法。而且,无论如何,你想尽快关闭。
大多数情况下,getConnection()
只会从连接池中获得连接,这些连接会保持打开状态很长时间。如果您没有close()
该连接,它将不会被放回可用连接池中,几秒钟或几分钟后,您将无法再使用任何连接。
标题询问System.exit()
,但问题正文没有。如果您致电System.exit()
,则连接将最终被关闭,因为数据库会注意到通信中断。但是程序启动,执行查询和退出的情况极为罕见。大多数应用程序启动并保持运行数天甚至数月。所以你真的想在完成使用后释放连接。
答案 1 :(得分:-2)
假设您为ekart应用程序带来了20个连接。这意味着连接池只有20个连接。如果您向服务器发送请求,则池为每个请求提供连接。如果您不关闭连接,则在第20次请求后,您将获得OutOfConnectionError',即使你无法处理这个错误也无法发送请求,因为没有连接。如果你关闭了conncetion那么只有你可以发送新的请求.........