【问题标题】:Timeout Exception with Spring Data JpaSpring Data Jpa 的超时异常
【发布时间】:2015-08-19 11:40:54
【问题描述】:

如果 Spring Data Jpa 存储库查询超时,我可以捕获哪些特定异常?

假设我有这样的存储库:

public interface VoucherRepository extends CrudRepository<VoucherEntity, String> {

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

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

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

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

使用的数据库是 PostrgreSQL。

【问题讨论】:

    标签: java spring postgresql jpa


    【解决方案1】:

    您会得到的例外是QueryTimeoutException,它是DataAccessException 的子类,它是通用的“使用 Spring 访问数据库时出错了”

    【讨论】:

      【解决方案2】:

      如果你已经配置了

       <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 来处理你的异常

      【讨论】:

        【解决方案3】:

        在使用 Spring 的 @Transactional 超时时,您会得到“org.springframework.transaction.TransactionSystemException”异常。

        实际上,您可以通过在测试期间锁定表格来模拟这种情况,如下所示。

        LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;
        

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

        【讨论】:

        • 如果数据库完全没有响应,使用事务时抛出的异常是org.springframework.transaction.CannotCreateTransactionException
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 2015-06-13
        相关资源
        最近更新 更多