如何判断数据库是否已关闭或不可用?

时间:2013-01-22 20:15:55

标签: java spring hibernate jms

我使用Spring DefaultMessageListenerContainer来使用队列中的消息。然后将消息保存到Oracle数据库。

当数据库发生故障时,我会从onMessage方法中抛出异常,并使队列中的消息重新处理。下面你可以看到在DataAccessResourceFailureException和CannotCreateTransactionException异常中,我将异常抛出该方法,然后将其放回队列中。其他例外不保存消息;它们对应于数据问题等。

public void onMessage(javax.jms.Message mqMessage) {
    ...get the message blah, blah, blah
    try {
        this.theService.doMessage(tmaticMessage, theHandler);
    } catch (DataAccessResourceFailureException e) {
        this.slowDown(mqMessage);
        throw e;
    } catch (CannotCreateTransactionException e) {
        this.slowDown(mqMessage);
        throw e;
    } catch (DataAccessException e) {
        ...
    } catch (TmUnusableMessageException e) {
        ...
    } catch (Exception e) {
        ...
    }
}

阅读Spring文档,我发现应该抛出DataAccessResourceFailureException“......当资源完全失败时:例如,如果我们无法使用JDBC连接到数据库。”问题是我刚做了一个测试,我让DBA将数据库关闭并得到一个新的异常:CannotCreateTransactionException。所以这是可以抛出的另外一个例外。我想知道是否还有其他人。

我正在使用Spring Connections和getHibernateTemplate()来进行调用。这是个问题。我怎么知道数据库出现故障时可以抛出什么异常?

1 个答案:

答案 0 :(得分:0)

可能复杂性是由各种方式导致的“数据库关闭”。例如:

  • 删除表格
  • 删除整个数据库
  • 禁用数据库用户帐户
  • 关闭数据库服务器

所有可以被视为“关闭数据库”,但每个都可能导致抛出不同的异常

如果您浏览spring javadoc中的以下部分,可能会抛出异常列表:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/dao/package-frame.html

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/package-frame.html