Spring Data JPA 中的超时异常

3

如果Spring Data Jpa repository 查询超时,我可以捕获哪些具体异常?

假设我有以下这样的repository:

public interface VoucherRepository extends CrudRepository<VoucherEntity, String> {

    @Transactional(readOnly = true, timeout = 30)
    VoucherEntity findByCode(String code);

    List<VoucherEntity> findAllByCodeIn(List<String> codes);
}

当超时发生时,调用者会看到哪个异常?

我不知道如何模拟这种情况,奖励问题是如何做到这一点?

使用的数据库是PostrgreSQL。

3个回答

5
您会收到的异常是QueryTimeoutException,它是DataAccessException的子类,后者是通用的"在使用Spring访问数据库时出现了问题"

4
如果您已经配置好了
 <jpa:repositories base-package="com.acme.repositories" />

从Spring文档http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.create-instances中得知:

使用此元素按照创建存储库实例的描述查找Spring Data存储库。此外,它激活了所有使用@Repository注释的bean的持久性异常转换,以将JPA持久化提供程序抛出的异常转换为Spring的DataAccessException层次结构。

因此,您可以捕获DataAccessException来处理您的异常。


1
当使用Spring的@Transactional超时功能时,您会收到“org.springframework.transaction.TransactionSystemException”异常。
实际上,您可以通过在测试期间锁定表来模拟这种情况,如下所示。
LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;

确保在完成测试并结束事务以释放表上的锁之前,交易未完成。


1
如果数据库完全没有响应,则在使用事务时抛出的异常是 org.springframework.transaction.CannotCreateTransactionException - Fredrik Jonsén

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接