Java 为什么要对ResultSet和Connection实例调用close()?

Java 为什么要对ResultSet和Connection实例调用close()?,java,jdbc,connection,resultset,Java,Jdbc,Connection,Resultset,当我不再需要在程序中使用这些ResultSet和Connection的实例时,为什么要对它们调用.close()方法 不这样做的危险(如果有的话)是什么?如果不关闭JDBC连接,那么在使用连接池的情况下,等待空闲JDBC连接恢复的可能性就会增加。关闭JDBC连接将允许更快的重用并提高性能 关闭结果集失败,可能导致某些数据库无法释放游标资源。*。close()允许对象实例释放对其可能持有的资源的引用 在ResultSet的情况下,这可能是相当多的其他对象。如果你“放开”ResultSet,GC最终

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


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

如果不关闭JDBC连接,那么在使用连接池的情况下,等待空闲JDBC连接恢复的可能性就会增加。关闭JDBC连接将允许更快的重用并提高性能

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

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

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

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

例如,对连接的数量进行限制并不少见。如果您尽快释放这些资源,您将有更好的响应和更少的失败可能性


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

这里有两个问题:

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

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

此外,获得连接的成本相当高,这就是为什么存在。这些操作使连接保持打开状态,但客户端获取连接并使用它们,然后在完成后将它们释放回池中

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

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

@Reimus-好的。但我为什么要关闭ResultSet实例呢?