java.sql.Connection对象在被垃圾回收时是否会自动关闭?
我遵循在最后一个块中放置java.sql.Connection对象在被垃圾回收时是否会自动关闭?,java,mysql,sql,garbage-collection,Java,Mysql,Sql,Garbage Collection,我遵循在最后一个块中放置close()的做法: void foo() { Connection conn; try { conn = getConnection(); // .. } final { try { conn.close() } catch(Exception e) { } } } 是否确实需要在连接上调用close(),或者垃圾收集器会自动执行此
close()
的做法:
void foo() {
Connection conn;
try {
conn = getConnection();
// ..
} final {
try {
conn.close()
} catch(Exception e) {
}
}
}
是否确实需要在连接上调用close()
,或者垃圾收集器会自动执行此操作
我对垃圾收集将导致的额外延迟没有意见,我只是不希望连接永远保持打开状态。是的,有必要调用
close()
。有一些JDBC包装器可以自动完成这类工作(例如Tomcat连接池),但一般来说,在涉及资源的任何地方都可以自己清理
是否确实需要对连接调用Close()
对
或者垃圾收集器将自动执行此操作
未指明。也许有些实现可以做到这一点。你不能依赖它
我同意GC将导致的额外延迟
GC可能永远不会发生。你真的同意无穷大吗
我只是不想永远保持联系
你不想让它们打开的时间超过必要的时间。它们是一种稀缺资源。不要浪费它们 一些JDBC连接实现在被垃圾收集时将
close()
。Postgres JDBC驱动程序的finalize()方法(代码)就是一个例子。不过,不能保证情况会如此
但是
无法知道连接对象的垃圾回收何时发生。垃圾收集器不知道JDBC资源,只知道内存。这意味着GC仅在需要释放内存时才会发生。如果您有60个连接,但仍然有可用内存,那么GC将不会运行,并且您将最终耗尽连接
还可能发生某种JDBC连接池。这意味着您得到的连接
对象不是真正的连接,而是封装在池逻辑中的连接。如果您不close()
这些连接,连接池将不知道您已完成这些连接,并且无法将它们重新用于其他请求,连接池将耗尽
因此,如果您创建了连接,请始终显式地关闭连接。由于数据库连接不应保持打开状态,垃圾收集可能不会关闭它,因此使用Try with Resources的Java 7“project coin”语法非常有用。实现的任何东西都可以使用,如下所示
void foo() {
try( Connection conn = getConnection() ) {
// Do your Database code
} catch(SQLException e) {
//Handle the exception
}
} //conn is closed now since it implements AutoCloseable.
完成连接后,您有责任关闭连接。垃圾收集器不会为您执行此操作。也许这回答了您的问题:总之,您需要关闭连接以防止各种泄漏,并且不能依靠GC为您执行此操作。在连接完成之前,您可能会耗尽连接。没有关闭,它就不可靠。您可能想试试“执行周围”的习惯用法。(由于您的代码显然是编写的,您似乎放弃了关闭异常(可能是由于获取失败而导致的NPE)-您可能想从那里抛出某种异常,类似于获取连接时抛出的异常。对于Java SE 7,您可以使用新的try-with-resource语法简洁地做大致正确的事情,但执行起来仍然是成功的。)JVM依靠人工编写好代码来关闭每个未使用的db连接。这是荒谬的。计算机不应该帮助避免人类犯错误吗?