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

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

没有这样做的危险(如果有的话)是什么?

这里有两个问题:

数据库连接

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

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

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

结果集

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

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

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

Connection对象将保存与连接关联的资源。 在这种情况下,GC将永远不会直接恢复这些资源(如果Connection实现了finalize方法,可能会间接恢复)。 你想*.close()任何可能阻碍任何有限性质资源的东西,所以这些资源可以被重用。

例如,在#连接上设置一些上限并不罕见。 如果您尽快释放这些资源,您将获得更好的响应和更少的失败可能性。

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

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

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

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