2011-08-23 57 views
2

一位同事和我在處理從事務性JDBC代碼拋出的運行時異常的最佳實踐方面存在分歧。他認爲捕獲異常而不是SQLException是正確的做法。他的論點是Connection.close();如果事務沒有被提交,則具有未定義的行爲。一些JDBC實現可能會回滾,而另一些可能會提交。如果你只是捕獲SQLException,那麼任何運行時異常在finally塊的close()方法上都會有未定義的行爲。處理事務性jdbc代碼中的運行時異常

目前認爲是最佳做法,以趕上異常,如果不是,你如何解決他描述的情況?

Connection connection = null; 
try { 
    connection = ... 
    // transactional code 
} catch (final Exception e) { 
    connection.rollback(); 
} finally { 
    // close other resources 
    if (connection != null) { connection.close(); } 
} 

回答

0

我會趕上例外,甚至Throwable。這一切都取決於你的塊內的代碼。

例:

如果調用另一個DAO堅持另一個實體,你會爲確保捕獲任何類型的異常,以確保您回滾您的TRX。

你必須自己問一下這個問題:即使發生了一些非SQLException,我也想提交trx嗎?

根據我的經驗,我的答案是否定的! ;-)

但這就是我。

問候

0

按java.sql.Connection中的Javadoc中,緊密的行爲是依賴於實現的。

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

根據業務需求可以安全地執行/回滾執行/回滾