在Java中关闭数据库连接
这只是一个java程序员愚蠢的提问。 我有点像在Java中关闭数据库连接,java,jdbc,Java,Jdbc,这只是一个java程序员愚蠢的提问。 我有点像 PreparedStatement stmt = DBConnection.getConnection() .prepareStatement(sql); 现在在finally block中,我检查stmt是否存在,然后关闭它。在这种情况下,连接对象将发生什么情况。我知道如果我写在单独的行中,那么我可以关闭它,因为我有一个对连接对象的引用,而在本例中我没有 在这种情况下,连接对象将发生什么情况 没什么。没有魔法,所
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的潜在影响的额外细节。