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
当应用程序运行数小时或数天时会发生这种情况。
我所阅读的大部分内容都谈到了如何在将Spring集成到Spring或类似的东西时使用Hibernate。因此,每个Web请求都会启动一个新线程,如果该线程死亡,它只会影响该一个Web请求。但是对于独立的Java应用程序,我们应该如何处理它呢?
答案 0 :(得分:2)
捕获RuntimeException没有错。它未经检查只是为了让你不要选择。
如果你有一个特定的策略来处理异常(比如再次尝试,或者在app逻辑中触发其他东西),一定要抓住它!
答案 1 :(得分:1)
Hibernate Exceptions未经检查,因为它们不想强迫您捕获它们,如果您想在DAO或任何其他地方处理,则由应用程序的设计决定。
如果您的情况应该处理(Catch)PersistenceException
,并采取纠正措施通知您的用户发生了一些不良事件。
正如其他一般性说明的答案所强调的那样,抓住RuntimeException
并采取纠正措施没有任何害处,通常建议抛出RuntimeException
而不是CheckedException
。
答案 2 :(得分: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.1.0.M1/spring-framework-reference/html/beans.html并详细了解第3.2节。