当前位置: 首页 > 知识库问答 >
问题:

语句和Resultset在连接关闭后关闭

葛意远
2023-03-14

我最近转到了一个项目,在这个项目中我遇到了很多这种性质的代码--(这是使用jdbc postgres驱动程序)

try {
    Connection conn = pool.getAConnection(); //home-grown conn pool 
    PreparedStatement ps = ..;
    ResultSet rs = ..;
    rs = ps.executeQuery();
    ...
 } catch (SQLException se) {
    conn.close(); 
} finally {
    if (stmt != null) stmt.close();
    if (rs != null) rs.close();
}

显然,这段代码已经在生产中运行了一段时间,没有引起问题。

为了进一步澄清,如果我的理解是正确的(即,statement和resultset必须在连接关闭之前而不是之后关闭),我需要在catch和finally之间重复一些代码。修订后的代码如下所示。这可以简化吗?

try {
...
} catch(Exception ex){
      if (rs != null) {
         close(rs); rs = null; // close() method impl just calls rs.close() in try-catch block
      }
      if (ps != null) {
         close(ps); ps = null;
      }
      processException( ex, con); // This method logs and then either closes the connection or releases to pool, depending on some conditions. 
      con = null;
  } finally {
      if (rs != null) {
          close(rs); 
      }
      if (ps != null) {
          close(ps); 
      }             
      if (null != con) {
          close(con);
      }
  }

只是为了透视,这段代码是全部--至少有100个左右的方法!如果可能的话,我想进一步简化这一点。感谢你的反馈。

共有1个答案

商振
2023-03-14

finally块中释放连接非常有意义。在finally块中关闭语句resultset也是如此。

推理很简单:您要确保在成功执行和异常情况下都关闭语句resultset。连接也是如此。我会在finally块中执行类似的操作

try{

}catch(Exception exe){

}finally{
    if (stmt != null) stmt.close();
    if (rs != null) rs.close();

    //release connection to connection pool

}

另外,我相信当语句关闭时,其当前的ResultSet也将关闭。因此,如果rsstmt相关联,那么我相信在执行stmt.close()时它将被关闭

 类似资料:
  • 问题内容: 我一直在对我们的一个宠物项目进行代码审查(通常使用诸如FindBugs之类的工具),并且FindBugs将以下代码标记为错误的(伪代码): 错误是此代码可能不会释放资源。我发现ResultSet和Statement没有关闭,所以我最终将它们关闭: 但是我在许多项目(来自许多公司)中遇到了上述模式,没有人关闭ResultSets或Statements。 关闭连接时,是否关闭了Result

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 问题内容: 尽管随后关闭了连接,是否必须分别关闭JDBC结果集和语句?据说在使用后关闭所有JDBC资源是一个好习惯。但是,如果我有以下代码,是否有必要关闭结果集和语句? 问题是连接的关闭是否可以完成任务,或者它是否使某些资源处于使用状态。 问题答案: 你所做的是完美且非常好的做法。 我说这是一个好的做法的原因……例如,如果由于某种原因你正在使用“原始”类型的数据库池并调用,则连接将返回到池中,并且

  • 我在Jpa存储库中使用Spring Boot。我在循环中保存一些记录,在保存所有记录后,会打印下面的异常。 JAVAsql。SQLRecoverableException:oracle的Instruço Fechada。jdbc。驾驶员OracleClosedStatement。oracle上的getMaxRows(OracleClosedStatement.java:3578)~[ojdbc6-

  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

  • 我读过很多帖子,人们说在java、语句等中关闭连接,但我没有找到我的问题的答案。 我问我不做Con.close(),但我做所以它会关闭连接或不? 所以我只想知道,当我们关闭结果集时,连接是否会关闭?