【问题标题】:question about handling loss of database connection in JSF app关于在 JSF 应用程序中处理数据库连接丢失的问题
【发布时间】:2011-06-22 16:08:02
【问题描述】:

我有一个为 Hibernate 实现了 DAO 层的 JSF 应用程序(也使用 Spring 进行事务管理)。

我遇到的问题是数据库偶尔会出现故障,当这种情况发生时,我希望 JSF 应用程序重定向到“丢失与数据库的连接”页面。

我可以想到两种方法来处理这个问题:

(1) 一个阶段监听器,在每个请求上测试数据库连接,如果数据库不存在则重定向; (除了这意味着对每个 Web 应用程序请求进行额外的数据库查询)

(2) 让每个 DAO 中的每个方法都抛出某种“NoDBConnectionExcepiton”并在支持 bean 中捕获该异常并在那里重定向(除非这意味着要编写大量异常处理代码)

有人有什么想法吗?建议和意见表示赞赏!

罗伯

【问题讨论】:

    标签: hibernate jsf


    【解决方案1】:

    让每个 DAO 中的每个方法都抛出某种“NoDBConnectionExcepiton”

    我会去的。您可以让它成为它已经抛出的某个异常的子类,这样您就不需要更改throwscatch 子句。例如,SQLException 的子类可能吗?

    并在支持 bean 中捕获该异常并重定向到那里(除非这意味着要编写大量异常处理代码)

    不一定。您可以在web.xml 中为特定异常定义自定义错误页面,以便容器自行处理。

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

    【讨论】:

    • 我喜欢这个想法,但 OP 声明他在 DAO 中使用 Hibernate。 Hibernate 不会让 SQLException 逃逸并将其转换为运行时异常 HibernateException。因此,需要为每个 DAO 方法添加所有 try/catch/throw 脚手架,为每个方法添加 throws 子句,然后将 try/catch 添加到调用 DAO 的服务方法中。
    • @Olaf:啊,我忽略了那一点。然后我让它扩展HibernateException
    【解决方案2】:

    当出现问题时,Hibernate 已经抛出未经检查的 HibernateException。如果您的应用程序(合理地)没有错误,您可以将所有 HibernateExceptions 解释为数据库已关闭的指示并将它们视为此类。一个 RuntimeException 的好处是:您选择在应用程序的哪一层处理它们。

    【讨论】:

    • 嗨奥拉夫;我有这个想法的问题是我把所有东西都解耦了,比如 *.JSF->Handler.java->Service.java->DAO.java->Hibernate;并且每一层捕获异常并处理它们或将其或新异常抛出到下一层;要执行您的建议,我必须在所有层显式添加 throws/catch HiberateException,以便 Handler.java 可以适当地重定向,但是 DAO 层是唯一知道 Hibernate 甚至在实现中的层,所以它很漂亮很大程度上打破了解耦设计。
    • @Robert Hume:嗯,有些层需要知道 DAO 层正在与数据库通信。它也可能知道它通过 Hibernate 与它对话。我建议使用您的示例 NoDBConnectionExceptions 在服务层中捕获 Hibernate 异常并将它们重新抛出为选中状态。
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多