Spring JPA-处理数据库/仓库异常

时间:2020-04-20 16:09:56

标签: java spring spring-boot exception spring-data-jpa

我有一个SpringBoot应用程序,该应用程序使用spring数据CrudRepository来保留消息。 对于应用程序,重要的是在出现 DB服务器端异常时不要丢失消息。

例如数据库服务器无法访问或数据库实例面临内存问题等。

因此,我想特别处理它们,然后重试直到数据库服务器端问题解决为止 解决。 我碰到了这篇文章,其中解释了Spring JPA抛出的Exceptionhttps://danielkvist.net/code/spring-data-crudrepository-exceptions 其中总结了Spring JPA的Exception层次结构。因此,我遵循了Exception处理逻辑。

saveMessages (List<Message> messages)
{
    try {
        crudRepo.saveAll(messages);
    } catch (NonTransientDataAccessException | TransientDataAccessException e) {
      // throw custom retryable exception for the service to retry
      throw new CustomRetryableException(e);
    }
}

在生产中执行代码时,上述逻辑失败,因为引发了各种异常。 例如当数据库服务器宕机CannotCreateTransactionException时,或者在请求TransactionSystemException之间重启数据库服务器时。 所以我想我错过了处理TransactionException

的子类

问题:

  1. 处理TransactionException的子类的最佳方法是什么? (在开头我提到的上下文中)

  2. 除了DataAccessExceptionTransactionException之外,还有其他应处理的其他异常吗?

1 个答案:

答案 0 :(得分:0)

您可以捕获异常的父类,但是如果您想在DAO /服务中捕获/处理异常,我只会捕获RuntimeException

try {
    crudRepo.saveAll(messages);
} catch (RuntimeException e) {
  // add log here!

  throw new CustomRetryableException(e);
}

另一种方法是使用通用的ExceptionHandler在单独的类中定义此逻辑(您也可以为不同的异常定义不同的处理程序)

 @ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> genericHandler(HttpServletRequest request, RuntimeException ex) {

更多信息和示例here

相关问题