2010-03-02 36 views
1

我正在閱讀Spring Recipes這本書,並且對此感到困惑:任何異常都是作爲DataAccessException的子類引發的,您不打算嘗試捕獲RuntimeException/catch 。在Java/Spring中處理與數據庫相關的異常

我擔心的是更可能發生的問題,特別是插入問題。如果您使用的是類似SimpleJdbcTemplate的東西,則每個查詢都是它自己的事務,因此您無法確保密鑰不在表中,而是使用getSimpleJdbcTemplare.update()執行插入操作,因爲可能在兩個查詢之間插入了密鑰。

很明顯,這是一個比生產系統中的RuntimeException更適合處理的東西。那麼你如何處理?

謝謝。

+1

首先,並非每個查詢都必須是一個事務,您可以按照您想要的任何方式劃分事務,通常在服務方法級別。 你能否詳細說明爲什麼你認爲這個重複的關鍵問題會在你的應用程序中經常發生? – 2010-03-02 22:32:24

回答

2

a RuntimeException你不打算去 try/catch。

說誰?你不要趕上RuntimeException,但沒有什麼可以阻止你這樣做,這是完全可以接受的。例如,有一個DataAccessException的子類,稱爲RecoverableDataAccessException,它專門用於捕獲以便可以嘗試重試。還有OptimisticLockingFailureException,它解決了由於樂觀鎖定導致的下一個事務性衝突點,並且也可以由應用程序專門捕獲和處理。

如果你正在使用類似 了SimpleJdbcTemplate每個查詢是其 自己的事務

事實並非如此。如果您使用Spring的transactional semantics,那麼SimpleJdbcTemplate(或您使用的任何DAO組件)將參與事務,如果數據庫和事務管理器支持它(最應該),則使用完整的ACID語義。在你的例子中,你可以做一個select for update(或者你的數據庫支持的)insert,全部在一個事務中。

Spring的數據訪問層可能是它的最佳特性,但它很少得到好評。

+1

在本書中進一步閱讀我看到你對事務處理是正確的。許多控制,以及很多配置方式。 關於捕捉異常,我認爲這不應該只是說「你不必」,而是「但你應該,這是如何」是本書的錯。謝謝你清理那個。 – 2010-03-04 05:08:05