2011-07-25 25 views

回答

1

編號JDBC需要你自己(所有這些對象都在close之內),並且在finally塊中能夠處理異常。

只關閉連接應該關閉從它派生出來的所有對象,但我不會依賴它,並且最好儘快關閉它。相反肯定是不正確的(關閉ResultSet將不會關閉連接),並且也無法從ResultSet獲取父Connection(我認爲這是您的問題的要點)。

我建議不要直接使用JDBC,而應該在頂部使用更友好的框架,至少像Commons DBUtils一樣,它會照顧清理這些資源。

+0

我做了大量的方法。因此,如果通過使用像AOP這樣的技術來處理批處理調用close()的處理,那麼認爲質量是抵押的。 因此,現在使用Apache Commons進行替換存在相當大的風險。 – yohei

+0

它不認爲AOP是一個很好的解決方案。管理數據庫連接不應該是「橫切關注點」,即分散在整個項目中。它應該集中在一小組課程中。你的「業務邏輯」(知道查詢的代碼)應該不需要混淆JDBC連接。 – Thilo

0

當您打開任何連接或創建任何Statement/ResultSet明確關閉它們。 在完成JDBC代碼之後,總是嘗試調用此方法

public void closeResultSetAndStatement(final Connection connection, 
      final Statement statement, final ResultSet resultSet) { 
     try { 
      if (null != resultSet) { 
       resultSet.close(); 
      } 
     } catch (Exception e) { 
      Log.warn(
        "Exception while resultset statement. Not Throwing Exception, Ignoring it.", 
        e); 
     } 

     try { 
      if (null != statement) { 
       statement.close(); 
      } 
     } catch (Exception e) { 
      Log.warn(
        "Exception while closing statement. Not Throwing Exception, Ignoring it.", 
        e); 
     } 

     try { 
        if (null != connection) { 
      connection.close(); 
        } 
     } catch (Exception e) { 
      Log.warn(
        "Connection could not be closed. Not Throwing Exception, Ignoring it.", 
        e); 
     } 
    } 
+0

如果使用名爲lombok的庫,可以這樣做:import java.sql。*; import lombok.Cleanup; public class TEST {public static void main(String [] args)throws Exception {Connection conn = null; // Statement @Cleanup Statement cstmt = null; cstmt = conn.prepareCall(「{call 11111.22222(?, (); //執行cstmt.executeBatch(); //寫入文件代碼到這裏}}結果,因爲這個庫使用java6,所以我使用java5不能使用它,儘管close()會自動調用Statement。 – yohei

+0

不管你使用的是Java6還是Java5,都不應該有任何問題 – BOSS

+0

認爲不應該把涉及交叉關注問題的事情放在邏輯中只要有可能。 – yohei

相關問題