12

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

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

4

4 回答 4

12

这里有两个问题:

数据库连接

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

积极的一面是,预编译语句保持编译状态并可供使用,因此如果您正确编码和使用 SQL,您可以通过重用预编译语句获得显着的性能优势。但是,这样做可能会使您的代码复杂化,因此建议您小心。

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

结果集

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

于 2012-07-31T00:59:15.280 回答
7

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

在 a 的情况下,ResultSet这可能是相当数量的其他对象。GC 最终会清理它们——如果你“放开” ResultSet. 进入是一个好习惯。

一个Connection对象将持有与连接关联的资源。在这种情况下,GC 永远不会直接恢复这些资源(如果Connection实现finalize方法可能间接恢复)。您想要*.close()任何可能占用任何有限性质的资源的东西,以便可以重用这些资源。

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

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

于 2012-07-31T00:52:09.807 回答
2

通过不关闭 JDBC 连接,您增加了长时间等待空闲 JDBC 连接在使用连接池时获得的可能性。关闭 JDBC 连接将允许更快的重用并提高性能。

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

于 2012-07-31T00:49:06.217 回答
0

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

于 2015-07-19T11:41:17.637 回答