2012-05-23 64 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节仔细看看。