重用 PreparedStatement

Posted

技术标签:

【中文标题】重用 PreparedStatement【英文标题】:Reusing a PreparedStatement 【发布时间】:2010-11-04 07:47:15 【问题描述】:

我在我们的代码库上运行了 findbugs,它指出还有两个语句仍然需要关闭。在我们运行的这部分代码中:

preparedStatement = connection.prepareStatement(query);

对于 3 个不同的查询,重用preparedStatement。在 finally 块中,我们确实关闭了资源:

finally
   try
      if (resultSet != null) 
         resultSet.close();
    catch (Exception e) 
      exceptionHandler.ignore(e);
   
   try 
      if (preparedStatement != null) 
         preparedStatement.close();
    catch(Exception e) 
      exceptionHandler.ignore(e);
   

语句是否应该在下一个connection.prepareStatement(query)之前关闭还是这个 findbugs 很谨慎?

【问题讨论】:

您是否需要参考是无关紧要的。当您调用 connection.prepareStatement(query) 时,您正在该连接中创建preparedStatement。那些将坐在那里,直到连接关闭。当你最终点击它时,你只是关闭了该变量指向的准备好的语句。留下 3 个中的 2 个,直到连接关闭。在生产中,如果您不删除Abandoned(tomcat) 等,您将继续泄漏连接并最终耗尽。 感谢您的解释!添加了更改:) 【参考方案1】:

是的,在执行下一个 connection.prepareStatement 之前必须关闭该语句。否则,您将失去对未关闭的前一个(又名泄漏声明)的引用。将 try finally 包裹在每个语句的使用中,并在 finally 中关闭它。

【讨论】:

就像还要指出,在关闭连接时应该清理泄漏的语句,最好单独关闭每个语句。如果此代码在打开的连接中重复多次,您会发现自己的资源不足(一次 2 条语句 =])

以上是关于重用 PreparedStatement的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中重用可重用的应用程序

如何使 UIPageViewController 像 tableview 重用单元一样重用控制器?

框架和设计模式的区别

如何使代码可重用? [关闭]

每个唯一的重用标识符是不是都有自己唯一的重用队列?

算法4:合并排序的套路 | 重用 | 分治