我使用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()来进行调用。这是个问题。我怎么知道数据库出现故障时可以抛出什么异常?
答案 0 :(得分:0)
可能复杂性是由各种方式导致的“数据库关闭”。例如:
所有可以被视为“关闭数据库”,但每个都可能导致抛出不同的异常
如果您浏览spring javadoc中的以下部分,可能会抛出异常列表:
http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/dao/package-frame.html