当我的程序中不再需要使用这些ResultSet和Connection的实例时,为什么我要对它们都调用.close()方法?
不这样做有什么危险(如果有的话)?
这里有两个问题:
数据库连接
保持数据库连接打开会消耗数据库上的资源;它使用内存,并且数据库被配置为具有最大数量的连接,因此您增加了连接耗尽的可能性。此外,会话的状态也会得到维护,因此您可能会遇到意外持有超出其预期范围的锁的问题。
从积极的方面来看,准备好的语句可以保持编译状态并随时可用,因此,如果您正确地编写和使用SQL,您可以从重用准备好的声明中获得显著的性能优势。但是,这样做可能会使代码复杂化,建议您小心操作。
此外,获得连接是相当昂贵的,所以这就是为什么存在连接池的原因。这些操作使连接保持打开状态,但客户端获取连接,使用它们,然后在完成后将它们释放回池。
结果集
如果不commit
(先关闭结果集,然后关闭结果集),保持结果集打开也会保持某些锁打开,因此,根据应用程序的不同,您可能会很快遇到死锁或严重的活动性问题。无论是否打开连接,都应尽快关闭结果集,以便将尽可能多的资源释放回数据库。
*.close()
允许对象实例释放对其可能拥有的资源的引用。
在ResultSet
的情况下,这可能是相当多的其他对象。如果你"放开"ResultSet
,GC最终会清理它们。这是一个很好的练习。
Connection
对象将持有与该连接相关联的资源。在这种情况下,GC将永远不会直接恢复这些资源(如果Connection
实现finalize
方法,则可能是间接的)。您希望*.close()
任何可能占用任何有限性质资源的内容,以便可以重用这些资源。
例如,对连接数设置一些上限并不罕见。你会有更好的反应&如果你能尽快释放这些资源,那么失败的可能性就会更小。
在BOTH的情况下,关闭可以提高代码的整体响应能力;这是一个很好的赌注。
通过不关闭JDBC连接,增加了在使用连接池的地方等待空闲JDBC连接的可能性。关闭JDBC连接将允许更快的重用并提高性能。
未能关闭结果集,可能会导致某些数据库无法释放游标资源。
如果您没有关闭结果集对象,您可能会在代码的长时间运行中面临内存不足的错误。当我错过了关闭它并直接将结果集引用设为null时,我遇到了内存不足的错误。我使用过MySQL数据库。