2013-03-28 60 views
2

在以下代碼片段中,使用JDBC Connection和PreparedStatement進行Java 7異常處理?

1)在調用「conn.close()」(通過AutoClose)之前,try-catch塊是否自動調用「conn.rollback()」? 如果不是,我是否必須在該塊中添加finally { conn.rollback(); }

2)Connection對象傳遞給bar()方法的方式,它的try-catch方法是否正確?

public void foo() { 
     try (Connection conn = datasource.getConnection()) { 

      bar(conn, "arg"); 
      conn.commit(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void bar(Connection conn, String args) throws SQLException { 
     try (PreparedStatement ps = conn.prepareStatement("SOME_QUERY")) { 
      // Do something 
      ps.executeUpdate(); 
     } catch (SQLException err) { 
      throw err; 
     } 
    } 

回答

7

一個試穿與資源就叫上Connectionclose()方法。調用Connection.close()當事務是活動的效果是實現定義:

強烈建議該應用程序顯式提交或回滾之前調用close方法活動事務。如果調用close方法且存在活動事務,則結果是實現定義的。

換句話說,不依賴於它,並明確調用commit()rollback()的實際行爲將驅動程序之間甚至同一驅動程序的版本有所不同。

鑑於你的榜樣,我建議:

public void foo() { 
    try (Connection conn = datasource.getConnection()) { 
     bar(conn, "arg"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

public void bar(Connection conn, String args) throws SQLException { 
    try (PreparedStatement ps = conn.prepareStatement("SOME_QUERY")) { 
     // Do something 
     ps.executeUpdate(); 
     conn.commit(); 
    } catch (SQLException err) { 
     conn.rollback(); 
     throw err; 
    } 
} 

既然你不能在創建它的trycatchfinally塊使用conn,你也可以窩吧:

public void foo() { 
    try (Connection conn = datasource.getConnection()) { 
     try { 
      bar(conn, "arg"); 
      conn.commit(); 
     } catch (Exception ex) { 
      conn.rollback(); 
      throw ex; 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
+0

感謝anwer.sorry我忘了在foo()中添加commit()。bar()方法中創建的PreparedStatement何時關閉? –

+0

在鏈接中說:「注意:try-with-resources語句可以像普通的try語句一樣捕獲並最終阻塞。在try-with-resources語句中,任何catch或finally塊都在資源聲明後運行已關閉。「那麼我應該在哪裏調用「conn.rollback()」?我在調用「conn.close()」後無法調用它,可以嗎? –

+1

你說得對,我搞混了。但是,由於您無法訪問catch或finally塊中的嘗試(包括資源)中創建的對象,因此在這種特定情況下這並不相關。 (我刪除了我以前的評論,所以我不會混淆別人,鏈接是:http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –