【问题标题】:Is closing statement is good enough or must we also close each of the resultset?结束语句是否足够好,还是我们还必须关闭每个结果集?
【发布时间】:2012-07-06 04:39:51
【问题描述】:

我们有一个 java 应用程序,我们使用多个语句变量。为什么需要不止一个语句的问题是,有时在为循环内的一个结果运行循环时,我们需要完成一些其他查询操作。大部分地方单条stmt用了很多次,最后我们关了。我们现在要确认的是,我们没有关闭结果集变量,并且我们注意到内存的使用在波动。那么在我们得到结果后立即关闭结果集或在 stmt 即将结束之前关闭结果集的最佳机制是什么?关门了吗?

【问题讨论】:

  • 在我的上一份工作中,我们发现 ResultSet 没有到达查询的末尾(例如,如果您不循环 while (rs.next()))并且您没有关闭它,它可以泄漏资源,至少对于 Oracle。如果您将其运行到查询的末尾,它似乎没有泄漏。
  • 我建议您在完成后立即关闭 ResultSet,与 Statement 相同,与 Connection 相同
  • 我推荐 resultSet.getStatement().close(); 关闭语句和结果集。
  • 我们无法关闭该语句,因为我们多次重复使用它,否则我们必须设置与每个新语句的连接,对吗?所以立即完成结果集,我们将关闭它。

标签: java jdbc


【解决方案1】:

完成后关闭它,与任何其他资源一样。 Mo 指出要坚持更长时间,尤其是在您测量记忆力时,这意味着存在记忆问题。

【讨论】:

  • 我们不会关闭 stmt 变量,因为我们会在整个程序中不断重复使用,并且只在最后的语句中关闭它,这很好,对吧?因此,我们将在读取完成后立即关闭结果集,而不是在最终语句中这样可以吗?
  • @user837306 '当你完成它'的哪一部分不清楚?
  • 我不清楚当你说完成每个查询的密切含义时,你是在建议一个新语句是吗?
  • @user837306 我根本没有说'finished with close',所以我不知道你现在在说什么。
【解决方案2】:

根据 JDBC 规范和 Statement.close() API doc 应该足够了:

注意:当一个Statement对象被关闭时,它当前的ResultSet对象,如果存在的话,也被关闭。

基于此,您应该能够假设您只需要关闭一个语句。但是,由于 Statement 的生命周期可能比使用从它获得的单个 ResultSet 更长,因此通常尽快关闭 ResultSet 是一个好主意。

语句可以有更长的生命周期,因为例如您再次使用它来执行另一个查询,或者在 PreparedStatement 的情况下使用不同的参数再次执行查询。如果你执行另一个查询,之前获取的 ResultSet 将被关闭。

【讨论】:

  • 是继续重复使用语句还是每次使用新语句的正确方法。我认为重用它是正确移动和安全起见的实用方法,只需关闭结果集即可。
  • 一般来说,您应该将PreparedStatement 与参数化查询一起使用,因为这样可以保护您免受 SQL 注入的影响,在这种情况下,您只能对同一查询(使用不同的参数)重用一个语句。除此之外,在重用 Statement 或创建新 Statement 方面没有真正的赞成或反对。
  • 我认为我们需要一些时间来转移到preparedstatement,因为我们现在有很多查询。因此,如果我们转向preparedstatement,那么对于每个查询,我们都必须使用一个新的Statement,是吗?
  • 是的,如果查询文本不同。
  • @user837306 并且您应该为不同的 SQL 使用单独的语句。有助于保持代码清洁并允许更轻松地重构。与执行相比,创建新语句的开销也很小。
猜你喜欢
  • 2017-05-24
  • 2013-07-10
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2018-11-03
  • 2017-11-24
相关资源
最近更新 更多