2016-07-01 38 views
0

我越来越'资源泄漏:'rsHP'没有关闭在这个位置'我到处使用rsHP = stmt.executeQuery(查询);结果设置资源泄漏,即使我关闭了RS?

这里是什么这个方法做了基本的布局...

public static void method(String x, Connection conn){ 
Statement stmtHP = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_UPDATABLE); 
ResultSet rsHP = null; 

try{ 
     ----ALGORITHM IN HERE------ 
     ****This is the general form of this method***** 

     queryHP = "select * from SOMETABLE where SOMETHING = 'blah'"; 
     rsHP = stmtHP.executeQuery(queryHP); 

     while(rsHP.next()){ 
      List.add(rsHP.getString("COLNAME")); 
     } 
      . 
      . 
     repeats for 8 different queries 
      . 
      . 
     queryHP = "select * from SOMEOTHERTABLE where SOMETHINGELSE = 'blah2'"; 
     rsHP = stmtHP.executeQuery(queryHP); 

     while(rsHP.next()){ 
      List.add(rsHP.getString("NEWCOLNAME")); 
     } 

}catch(Exception e){ 
     System.out.println("Hey dumbo you suck, Exception Found"); 
     rsHP.close(); 
     stmtHP.close(); 
     conn.close(); 
}finally{ 
     rsHP.close(); 
     stmtHP.close(); 
     // connection gets closed later if no exceptions thrown 
} 

}// end method 

在这里就结束了,我清楚地关闭我所有的东西。我很困惑,如果我的方法在抛出一个错误之外不关闭RS而终止字面上不可能发生内存泄漏。

回答

1

Connection#createStatement()抛出一个SQLException,因此此代码根本无法编译。

我建议你改变方法的签名

public static void method(String x, Connection conn) throws SQLException 

对于资源泄漏,我想使用下面的逻辑会帮助你

try{ 
    // code 
    rsHP.close(); 
    conn.close(); 
}catch(Exception e){ 
    // StackTrace 
}finally{ 
    if (rsHP != null) rsHP.close(); 
    if (conn != null) conn.close(); 
} 
+1

我有抛出SQL异常,我只是试图简短,我有一些内部如果错误捕捉,我认为与try catch冲突,所以我可能会清理它,看看它是否解决了这个问题。我认为你是正确的做法是在试验结束时添加关闭,最后将它们移除,并将if添加到最后。感谢您的输入! – Cody

+0

@Cody不客气!随意标记此答案为接受:) –