3

次のコードを検討してください

ResultSet rs = null;
Statement st = null;
try {
  //do somehting
 } catch (Exception e){
  //do something
 } finally {
     if(st != null){
       try {
       st.close();
       } catch (SQLException e) {
            log.error("Exception while closing statement: " + e);
       }
    }
 }

問題は、ステートメントを閉じるときに、結果セットも閉じるのか、それともこのように結果セットを明示的に閉じる必要があるのか​​ということです。

if(rs != null){
   try {
   rs.close();
   } catch (SQLException e) {
        log.error("Exception while closing result set: " + e);
   }
}

ステートメントを閉じると結果セットが自動的に閉じられると思いましたが、結果セットを明示的に閉じないと、FindBugsは次の警告をスローします

このメソッドは、java.sql.ResultSetのクリーンアップに失敗する可能性があります

4

3 に答える 3

7

Statementオブジェクトが閉じられると、現在のResultSetオブジェクト(存在する場合)も閉じられます。

これは、Oracleに問題がある可能性があり、を明示的に閉じる必要がある可能性があることを示していますResultSet。しかし、繰り返しになりますが、Javadocによると、これは問題にはならないはずです。したがって、警告は、多分。

于 2012-05-15T13:56:05.420 に答える
3

ResultSetが自動的に閉じられることを期待することはできません。これは、ドライバーの実装とその準拠度によって異なります。最善のポリシーは、ResultSetを明示的に閉じることです。

于 2012-05-15T13:57:25.057 に答える
1

ステートメントまたは接続を閉じるとき、デフォルトではすべての子も閉じる必要があります。

于 2012-05-15T13:54:37.493 に答える