0

我得到的结果集已经关闭,我将结果集传递给其他方法。我应该在哪里关闭结果集。

public void mainTest(){

ResultSet rs= pstmt.executeQuery(query);

List list = populateRS(rs);

if(rs!=null)rs.close();
}

public List populateRS(ResultSet rs){

//work with result set
if(rs!=null)rs.close();
}
4

6 回答 6

5

即使(或其他)抛出异常,您也应该使用try-finally块来关闭:ResultSetpopulateRS

ResultSet rs;
try {
    rs = pstmt.executeQuery(query);
    List list = populateRS(rs);
} finally {
    if (rs != null) {
        rs.close();
    }
}
于 2013-08-13T18:53:02.667 回答
5

如果可能,请以与您打开时相同的方法关闭。始终如一地这样做使代码审查人员和维护人员可以轻松地将资源分类(显然已释放,显然有问题,并且需要更多关注)。

其他一些注意事项:

  1. 使用try (...)或执行关闭以关闭finally资源,即使使用它的代码因异常而失败。
  2. 酌情使用@WillClose@WillNotClose注释,以便 IDE 和 findbugs 等工具可以指出问题。

public void mainTest(){
  List<?> list;
  try (ResultSet rs = pstmt.executeQuery(query)) {
    list = populateRS(rs);
  }
  // work with list
}

public List<?> populateRS(@WillNotClose ResultSet rs){
  //work with result set
}

或者如果你被旧的 Java 卡住了:

public void mainTest(){
  List<?> list;
  ResultSet rs = pstmt.executeQuery(query);
  try {
    list = populateRS(rs);
  } finally {
    if(rs!=null)rs.close();
  }
  // work with list
}
于 2013-08-13T18:53:22.297 回答
3

使用新的try-with-resources 语句,无论是否发生异常都会自动关闭 ResultSet,因为它实现了AutoCloseable

try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。

public void mainTest()
{
  try (ResultSet rs = pstmt.executeQuery(query)) { 
     List list = populateRS(rs);
  } catch (SQLException ex) {

  }
}

public List populateRS(ResultSet rs){
    // work with result set
}
于 2013-08-13T19:06:10.963 回答
2

最好在你打开的地方关闭。
finally块中关闭所有资源是一种很好的编程习惯

       public void mainTest()
       {
         ResultSet rs = null;
         try{ 
              rs= pstmt.executeQuery(query);
             List list = populateRS(rs);
          }finally{
               try {
                 rs.close();
               } catch (SQLException ex) {

               }
          }
      }

     public List populateRS(ResultSet rs){

        //work with result set

    }

根据java文档

将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

于 2013-08-13T18:54:42.797 回答
1

关闭你打开它们的地方附近的东西。在这种情况下,这将在您调用 populateRS 后的 mainTest 方法中。如果一个方法没有打开某些东西,它不应该关闭它。

于 2013-08-13T18:50:56.080 回答
0

您应该关闭方法ResultSet中的mainTest以隔离populateRS方法在ResultSet.

您应该有一个finally块,您应该在其中关闭ResultSet. 这种做法可以保证ResultSet即使抛出异常也会关闭。

于 2013-08-13T18:52:29.740 回答