当我不再需要在我的程序中使用那些ResultSet和Connection的实例时,我为什么要在它们上面调用.close()方法呢?
不这样做会有什么危险(如果有的话)?
答案 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数据库。