Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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,这只是一个java程序员愚蠢的提问。 我有点像 PreparedStatement stmt = DBConnection.getConnection() .prepareStatement(sql); 现在在finally block中,我检查stmt是否存在,然后关闭它。在这种情况下,连接对象将发生什么情况。我知道如果我写在单独的行中,那么我可以关闭它,因为我有一个对连接对象的引用,而在本例中我没有 在这种情况下,连接对象将发生什么情况 没什么。没有魔法,所

这只是一个java程序员愚蠢的提问。 我有点像

PreparedStatement stmt = DBConnection.getConnection()
                .prepareStatement(sql);
现在在finally block中,我检查stmt是否存在,然后关闭它。在这种情况下,
连接
对象将发生什么情况。我知道如果我写在单独的行中,那么我可以关闭它,因为我有一个对连接对象的引用,而在本例中我没有

在这种情况下,
连接
对象将发生什么情况

没什么。没有魔法,所以连接不会神奇地关闭,只是因为您没有将其分配给变量

这就是为什么对
连接使用单独的变量的原因:这样就可以调用
close()
!或者使用try with资源:

try (Connection connection = DBConnection.getConnection()) {
    PreparedStatement stmt = connection.prepareStatement(sql);
}

连接将保持打开状态,直到将来某个时候对其进行垃圾收集


但是,在连接池的情况下,您的可能不是对连接的唯一引用(如果池还维护对已借用的连接的引用)。在这种情况下,不会进行垃圾收集,并且不会关闭收集。它将从池中“泄漏”,这可能最终导致池耗尽,并且不再有可用的连接。

否,GC不会为您关闭打开的连接。这就是为什么存在
close()
方法。@MattBall我想这取决于jdbc驱动程序的实现。如果未明确关闭,则应在finalize中关闭连接。建议不要依靠垃圾收集来关闭连接。他们绝对应该在最后一个街区关闭。这与InputStreams和其他资源类似。您不能单独安全地依赖
finalize
。那么连接池呢?关键是,代码必须以某种方式明确告诉系统何时完成了连接/流/资源的处理。@MattBall即使使用连接池,如果连接池提供一个包装物理连接的代理或包装器(顺便说一句,这是通常的实现),gc也可以工作“我只是简单地说明什么/将要发生/将要发生,这是问题所在,而不是一个人/应该/做什么。”。我添加了一些关于进一步延迟或阻止GC的潜在影响的额外细节。