2011-06-22 45 views
1

我有一個JSF應用程序,其中爲Hibernate實現了DAO層(也使用Spring進行事務管理)。有關處理JSF應用程序中數據庫連接丟失的問題

我遇到的問題是偶爾會發生數據庫故障,當發生這種情況時,我希望JSF應用程序重定向到「丟失的數據庫連接」頁面。

有我能想到的來處理這兩種方法:

(1)階段偵聽器,測試在每次請求數據庫連接和重定向如果數據庫是不存在的; (除了這意味着每個Web應用程序請求額外的數據庫查詢)

(2)每個DAO中的每個方法都會拋出某種「NoDBConnectionExcepiton」並在後臺bean中捕獲該異常並在那裏重定向(除非意味着寫入大量的異常處理代碼)

有沒有人有任何想法?建議和建議表示感謝!

Rob

回答

2

在每一個DAO的每一個方法拋出某種 「NoDBConnectionExcepiton」

我會去這一點。您可以讓它成爲某個已拋出異常的子類,以便您不需要更改throwscatch子句。例如,SQLException的子類可能是?

,趕上在後臺bean,例外和重定向存在(除了這意味着寫了很多的異常處理代碼)

不一定。您可以在web.xml中爲特定例外定義自定義錯誤頁面,以便容器自行處理。

<error-page> 
    <exception-type>com.example.NoDBConnectionException</exception-type> 
    <location>/errors/dbconnection.html</location> 
</error-page> 
+0

我喜歡這個想法,但是OP聲明他在DAO中使用Hibernate。 Hibernate不會讓SQLException轉義並將其轉換爲運行時異常HibernateException。所以它需要在每個DAO方法中添加所有try/catch/throw腳手架,爲每個方法添加throws子句,然後將try/catch添加到調用DAO的服務方法中。 – Olaf

+0

@奧拉夫:我忽略了那一點。然後,我會讓它擴展'HibernateException'。 – BalusC

1

當某些事情出錯時,Hibernate已經拋出未經檢查的HibernateException。如果你的應用程序(沒有錯誤)沒有錯誤,你可以將所有的HibernateExceptions解釋爲表示數據庫關閉並按照這種方式處理它們。它是一個RuntimeException的好處:你選擇了你處理它們的應用程序的哪一層。

+0

Hi Olaf;我有這個想法的概率是我有一切解耦像* .JSF-> Handler.java-> Service.java-> DAO.java-> Hibernate;並且每個圖層捕獲異常並處理它們或將其拋出或拋出新的異常直至下一層;做你在暗示我必須在所有圖層中明確添加throws/catch HiberateException的方法,這樣Handler.java可以適當地重定向,但是DAO層是唯一具有Hibernate甚至在實現中的知識的人,所以它很漂亮大大打破瞭解耦設計。 –

+0

@Robert Hume:好吧,有些圖層需要注意DAO層正在與數據庫交談。它也可能知道它通過Hibernate與它通信。我建議在Service層捕獲Hibernate異常,並使用您的示例NoDBConnectionExceptions將它們重新引導爲checked。 – Olaf

相關問題