JDBC 关闭资源

Posted

技术标签:

【中文标题】JDBC 关闭资源【英文标题】:JDBC Closing Resources 【发布时间】:2011-09-07 22:18:24 【问题描述】:

我不确定是否应该在每次查询后关闭语句和结果集,还是在完成所有查询后(即同时关闭连接)?

如果我错了,请纠正我,但我很确定两者都有效?

但是,如果我没有在每次查询后关闭语句然后执行大量查询,数据库最终会崩溃吗?

另一方面,为每个查询继续关闭和创建语句是否效率低下且浪费时间?

在问这个问题之前,我已经阅读了很多关于这个问题的资料,但我仍然不确定。任何帮助表示赞赏,

tre.

【问题讨论】:

【参考方案1】:

来自http://www.precisejava.com/javaperf/j2ee/JDBC.htm#JDBC118:

完成后关闭 ResultSet

使用完 ResultSet 后立即关闭 ResultSet 对象 即使 Statement 对象关闭了 ResultSet 对象 隐式关闭时,显式关闭 ResultSet 会提供机会 让垃圾收集器尽早回收内存,因为 ResultSet 对象可能会根据查询占用大量内存。

简而言之,您不必显式关闭您的ResultSet 对象,但最好提前释放内存。未能关闭您的 ResultSet 对象只会导致它占用的内存(可能小或大,取决于结果集的大小)被占用,直到相应的 Statement 对象关闭。

【讨论】:

您好,非常感谢您的回答。我以前读过这个但不确定 - 这是否意味着我应该在每次查询后关闭 ResultSet,但只在执行所有查询后关闭语句?谢谢。 @tre 我详细说明了我的答案。如果您需要更多说明,请告诉我。 确实如此,很抱歉要求进一步澄清,但这确实会有所帮助 - 这是否意味着单个语句的每个结果集都将保留到语句关闭?非常感谢,赞一个。编辑:我必须等一分钟才能说这是正确的答案:) 如果您从一个 Statement 中获得多个 ResultSet,那么它们都将保持打开状态,直到您 1) 手动关闭 ResultSet 对象或 2) 关闭 Statement。如果您从单个 Statement 中获取多个 ResultSet,那么最好在使用完它们后关闭未使用的 ResultSet,否则您的应用程序将继续占用更多内存空间。希望有帮助!【参考方案2】:

这到底有多重要取决于您正在做什么的具体细节。但通常最好关闭结果集(在 finally 块中)。从我一直阅读和看到的所有内容来看,打开连接本身就是性能损失的地方。

想要做的是非常快速地打开/关闭连接(这就是许多应用程序和服务器实现连接池的原因)。

【讨论】:

非常感谢,这真的非常有帮助 - 非常快速地打开/关闭连接正是我将要使用当前代码执行的操作,所以现在我知道我绝对不应该这样做。但是,在每次查询后打开/关闭语句会怎样——这也是不好的和不必要的吗? 我怀疑关闭并重新创建语句会造成很大的伤害,但如果我一次性执行几个查询,我不会关闭语句。

以上是关于JDBC 关闭资源的主要内容,如果未能解决你的问题,请参考以下文章

.什么是JDBC的最佳实践?

try(){}自动释放资源,AutoCloseable

JDBC访问数据库的基本步骤是什么?

JDBC/InvocationHandler动态代理实现数据库连接池数据源

jdbc如何在嵌套查询中处理连接的关闭问题

设计模式之模板模式