为什么我应该在ResultSet和Connection实例上调用close()?

时间:2012-07-31 00:44:44

标签: java jdbc connection resultset

当我不再需要在我的程序中使用那些ResultSet和Connection的实例时,我为什么要在它们上面调用.close()方法呢?

不这样做会有什么危险(如果有的话)?

4 个答案:

答案 0 :(得分:12)

这里有两个问题:

数据库连接

保持数据库连接打开会占用数据库上的资源;它使用内存和数据库配置为具有最大数量的连接,因此您可能会增加连接用尽的可能性。此外,会话的状态也会得到维护,因此如果意外地将锁定超出预期范围,您可能会遇到麻烦。

从积极的方面来说,准备好的语句可以编译并可以使用,因此如果您正确编写和使用SQL,您可以通过重用预准备语句获得显着的性能优势。但是,这样做可能会使您的代码复杂化,建议您小心。

此外,获取连接非常昂贵,因此存在connection pools的原因。这些连接保持打开状态,但客户端获取连接,使用它们,然后在完成后将它们释放回池中。

结果集

如果不commit(关闭结果集),保持结果集打开也会保持某些锁打开,因此根据您的应用程序,您可以快速解决死锁或严重的生动问题。无论您是否保持连接打开,请始终尽快关闭结果集,以尽可能多地将资源释放回数据库。

答案 1 :(得分:7)

*.close()允许对象实例释放对它可能拥有的资源的引用。

ResultSet的情况下,这可能是相当多的其他对象。 GC最终将彻底清理它们 - 如果你“放开”ResultSet。进入是一个很好的做法。

Connection对象将保存与连接关联的资源。在这种情况下,GC永远不会直接恢复这些资源(如果Connection实现finalize方法,则可能间接恢复)。您希望*.close()任何可能阻碍任何有限资源的资源,因此可以重复使用这些资源。

例如,在#连接上设置一些上限并不罕见。你会有更好的回应和如果你尽快释放这些资源,那么失败的可能性就会降低。

BOTH 的情况下,关闭可能会提高代码的整体响应能力;这是一个很好的选择。

答案 2 :(得分:2)

通过不关闭JDBC连接,增加了在使用连接池的情况下长时间等待空闲JDBC连接的可能性。关闭JDBC连接可以更快地重用并提高性能。

无法关闭结果集会导致某些数据库无法释放游标资源。

答案 3 :(得分:0)

如果未关闭结果集对象,则可能会在长时间运行代码时遇到内存不足错误。当我错过关闭它并直接将结果集引用作为null时,我遇到了内存不足错误。我使用过MySQL数据库。