Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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.sql.Connection对象在被垃圾回收时是否会自动关闭?_Java_Mysql_Sql_Garbage Collection - Fatal编程技术网

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连接。这是荒谬的。计算机不应该帮助避免人类犯错误吗?