2012-05-23 83 views
1

由Hibernate拋出的異常未經檢查,從我在其他地方看過的內容看來,它們似乎不應被捕獲到代碼中。但是,這意味着當例如發生臨時數據庫錯誤時,它發生的線程死亡,我們的應用程序變得無法響應。應該怎麼做?發生如何處理獨立Java應用程序中的Hibernate異常

例例外:

javax.persistence.PersistenceException 
Caused by: org.hibernate.exception.GenericJDBCException: could not insert 
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 

當應用程序已經運行了幾個小時或幾天會出現這種情況。

我讀過的大部分內容都是關於如何將Hibernate集成到Spring或類似應用程序時討論的。因此,每個Web請求都會啓動一個新線程,並且如果該線程死亡,它只會影響該Web請求。但是對於獨立的Java應用程序,我們應該如何處理它?

+0

感謝您的快速解答。我現在的做法是捕獲PersistenceException並拋出一個PersistenceCheckedException(我自己的類),然後根據正在做什麼處理它。要麼忽略它(如果數據庫插入不重要)或放棄數據庫插入(並且客戶端可以再試一次)。這聽起來不錯嗎? – GreatFire

回答

2

捕獲RuntimeException沒有任何問題。沒有檢查的是隻給你不要的選擇。

如果你有處理異常的特定策略(比如再次嘗試,或者在你的應用邏輯中觸發其他東西),一定要抓住它!

1

Hibernate異常沒有被檢查,因爲他們不想強迫你去捕捉它們,如果你想在DAO或其他地方處理,它將取決於應用程序的設計。

如果你的情況,你應該處理(捕捉)PersistenceException並採取糾正措施告知你的用戶發生了不好的事情。

由於強調了對方的回答上一般注有在捉住RuntimeException並採取糾正措施沒有害處,也通常建議拋出RuntimeException,而不是CheckedException

0

如果你有一個獨立的應用程序,你仍然可以使用Spring。在這一天結束時,Spring不過是一系列您配置爲加載和運行的java類。在中心你有一個ApplicationContext對象,它只是applicationContext.xml文件的對象版本。

基本上,在你的「public static void main(String [] args)」中,你可以從你的xml文件創建一個ApplicationContext。請注意,ApplicationContext是一個接口,因此您可能會調用FileSystemXmlApplicationContext(String configLocation)的構造函數。

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/support/FileSystemXmlApplicationContext.html#FileSystemXmlApplicationContext(java.lang.String

退房http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/beans.html和具有在3.2節仔細看看。