【问题标题】:Why should I call close() on a ResultSet and Connection instance?为什么要在 ResultSet 和 Connection 实例上调用 close()?
【发布时间】:2012-07-28 17:17:08
【问题描述】:

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

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

【问题讨论】:

    标签: java jdbc connection resultset


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        这里有两个问题:

        数据库连接

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

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

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

        结果集

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

        【讨论】:

          【解决方案4】:

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

          未能关闭结果集,可能导致某些数据库没有释放游标资源。

          【讨论】:

          • @Reimus - 好的。但我为什么要关闭 ResultSet 实例?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2013-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-02
          相关资源
          最近更新 更多