Jdbc 语句和结果集在连接关闭后关闭

Jdbc 语句和结果集在连接关闭后关闭,jdbc,Jdbc,我最近搬到了一个项目,在那里我遇到了很多这种性质的代码- (这是使用jdbc postgres驱动程序) 显然,这段代码已经投入生产一段时间了,没有引起任何问题 我发现很难理解的是,在异常流中,连接首先被关闭或返回到池中;然后尝试关闭语句和结果集。在父连接对象关闭后执行此操作有意义吗 由于代码的结构方式,连接释放必须在异常块中完成。这是无法改变的。 也就是说,在将连接释放到池之后,是否可以将stmt.close()和rs.close()保留在最后 为了进一步澄清,如果我的理解是正确的(即语句和结

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

显然,这段代码已经投入生产一段时间了,没有引起任何问题

我发现很难理解的是,在异常流中,连接首先被关闭或返回到池中;然后尝试关闭语句和结果集。在父连接对象关闭后执行此操作有意义吗

由于代码的结构方式,连接释放必须在异常块中完成。这是无法改变的。 也就是说,在将连接释放到池之后,是否可以将stmt.close()和rs.close()保留在最后

为了进一步澄清,如果我的理解是正确的(即语句和结果集必须在连接关闭之前而不是之后关闭),我需要在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个左右的方法!如果可能的话,我想进一步简化。
感谢您的反馈

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

推理很简单:您要确保在成功执行和异常场景中,您的
语句
结果集
都被关闭。连接也是如此。我会在
finally
块中执行类似的操作

try{

}catch(Exception exe){

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

    //release connection to connection pool

}

另外,我认为当一个
语句
关闭时,它当前的
结果集
也会关闭。因此,如果
rs
stmt
关联,那么我相信当您执行
stmt.close()

谢谢您的回复。同意,我将始终关闭语句并最终生成结果集。我试图在这里解决的问题(可能我没有明确说明)是——在上面的代码中,连接在catch子句中被关闭,后面是statement和resultset,最后——顺序似乎不符合逻辑。这样可以吗?运行这段代码没有任何问题,但我不相信它将来不会出现。在代码库中有很多这样的例子,这就是为什么除非花费的时间是合理的,否则我会犹豫是否重新更改它。在您发布的代码的第一部分中,您只有在出现异常时才关闭连接。无论是否发生异常,最好在完成工作后释放连接。实现这一点的最佳位置是
finally
块。关于第二段代码,为什么要在
catch
finally
块中编写相同的代码来关闭
resultset
preparedstatement
。反正这是多余的。只需将其作为
最终
逻辑的一部分就行了,没错,但这是我必须处理的遗留代码中的一个限制-关闭/释放连接必须保留在catch子句中。我所要做的就是释放资源。因为连接是在catch子句中释放的,所以我试图在连接关闭之前关闭并释放语句和结果集。这很混乱,但我不确定在连接关闭后最后再这样做是否正确。
try{

}catch(Exception exe){

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

    //release connection to connection pool

}