忽略JPA查询超时参数但@Transaction注释有效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了忽略JPA查询超时参数但@Transaction注释有效相关的知识,希望对你有一定的参考价值。

我希望我的Spring Boot应用程序对Postgres数据库进行的JPA查询在5秒后超时。

我创建了这个20秒的查询来测试超时:

@Query(value = "select count(*) from pg_sleep(20)", nativeQuery = true)
int slowQuery();

我在application.config中设置了以下属性:

spring.jpa.properties.javax.persistence.query.timeout=3000
javax.persistence.query.timeout=5000

但是查询在3秒或5秒后不会超时(执行仍需要20秒)。

奇怪的是,如果我用slowQuery注释@Transactional(timeout = 10),它会在10s左右后超时。

我宁愿不注释每个查询。我正在使用JPA 2.0和Tomcat连接池。

通过在应用程序属性文件中设置超时来使超时工作需要什么魔力?

答案

要使超时通用,在JpaConfiguration中,当您声明PlatformTransactionManager Bean时,可以设置事务的默认超时:

@Bean
public PlatformTransactionManager transactionManager() throws Exception {
    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory().getObject());
    txManager.setDataSource(this.dataSource);
    txManager.setDefaultTimeout(10); //Put 10 seconds timeout
    return txManager;
}

PlatformTransactionManager继承包含该方法的AbstractPlatformTransactionManager:

    /**
     * Specify the default timeout that this transaction manager should apply
     * if there is no timeout specified at the transaction level, in seconds.
     * <p>Default is the underlying transaction infrastructure's default timeout,
     * e.g. typically 30 seconds in case of a JTA provider, indicated by the
     * {@code TransactionDefinition.TIMEOUT_DEFAULT} value.
     * @see org.springframework.transaction.TransactionDefinition#TIMEOUT_DEFAULT
     */
    public final void setDefaultTimeout(int defaultTimeout) {
        if (defaultTimeout < TransactionDefinition.TIMEOUT_DEFAULT) {
            throw new InvalidTimeoutException("Invalid default timeout", defaultTimeout);
        }
        this.defaultTimeout = defaultTimeout;
    }

以上是关于忽略JPA查询超时参数但@Transaction注释有效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 设置默认查询超时?

JPA 命名查询与 group by 参数名和值

如何设置 JPA EntityManager 查询的超时时间

请教关于Spring Data JPA动态查询参数的问题

如何在spring data jpa查询中指定@lock超时?

Spring Data JPA 忽略空参数