2016-07-01 5 views
0

私はrsHP = stmt.executeQuery(クエリ)を使用するあらゆる場所で 'リソースリーク:' rsHP 'がこの場所で閉じられません。結果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キャッチと競合していると考えているので、私はおそらくそれをきれいにし、問題を修正するかどうかを参照してください。私はあなたが試し終わりまでクローズアップを追加して、最終的にそれらを削除し、最後にifを追加することが正しいと思います。入力いただきありがとうございます! – Cody

+0

@Cody大歓迎です!この回答を受け入れるように自由に記入してください:) –

関連する問題