gpt4 book ai didi

java - Spring JPA - 处理 DB/Repo 异常

转载 作者:行者123 更新时间:2023-12-01 17:19:18 31 4
gpt4 key购买 nike

我有一个 SpringBoot 应用程序,它使用 spring data CrudRepository 来保存消息。当存在数据库服务器端异常时,应用程序不要丢失消息,这一点很重要。

e.g. DB server unreachable or DB instance facing memory issues etc.

因此我想特别处理它们并重试直到数据库服务器端问题出现解决。我发现这篇文章解释了 Spring JPA 抛出的 Exception 类 https://danielkvist.net/code/spring-data-crudrepository-exceptions它总结了 Spring JPA 的 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 之外)?

最佳答案

你可以捕获异常的父类,但如果你想捕获/处理 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

关于java - Spring JPA - 处理 DB/Repo 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61326997/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com