3

我正在使用 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() 拨打电话。这是问题。我如何知道数据库出现故障时会引发哪些异常?

4

1 回答 1

0

也许复杂性是由您可以“关闭数据库”的各种方式引起的。例如:

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

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

如果您浏览 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

于 2013-01-23T00:31:34.197 回答