2012-05-15 136 views
2

考慮下面的代碼自動關閉結果集

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中

回答

7

When a Statement object is closed, its current ResultSet object, if one exists, is also closed.

Thisthis表明,甲骨文可能會遇到問題,你可能需要顯式地關閉ResultSet。但是,根據Javadocs,這不應該成爲一個問題。因此,也許是警告。

+0

任何想法,那麼爲什麼FindBugs報告這個警告? – comatose

+1

這可能是遺留問題。 IIRC,當Statement被關閉時關閉ResultSet並不總是在JDBC規範中(前一個looong,如1.2ish)。有可能有司機不正確地做。 –

1

當你關閉語句或連接,所有它的孩子也應該被默認關閉的。

3

您不能指望ResultSet被自動關閉,它取決於驅動程序的實現以及它的符合程度。最好的策略是明確關閉ResultSet。