Spring boot Oracle JPA 设置 QueryTimeout

Posted

技术标签:

【中文标题】Spring boot Oracle JPA 设置 QueryTimeout【英文标题】:Spring boot Oracle JPA set QueryTimeout 【发布时间】:2020-01-20 06:11:19 【问题描述】:

我正在使用带有 Ojdbc8 18.3.0.0.0 的 Spring Boot 使用 Hikari 数据源和 JPA,所有查询都可以正常工作。 但是现在我需要为所有数据库查询设置查询超时 我尝试了很多方法:

javax.persistence.query.timeout=1000
spring.transaction.default-timeout=1
spring.jdbc.template.query-timeout=1
spring.jpa.properties.hibernate.c3p0.timeout=1
spring.jpa.properties.javax.persistence.query.timeout=1

配置类:

@Configuration
public class JPAQueryTimeout 

    @Value("$spring.jpa.properties.javax.persistence.query.timeout")
    private int queryTimeout;   

    @Bean
    public PlatformTransactionManager transactionManager() throws Exception 
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setDefaultTimeout(queryTimeout); //Put 1 seconds timeout
        return txManager;
    

查询:

List<Integer> llll = manager.createNativeQuery("select test_sleep(5) from dual")
            .setHint("javax.persistence.query.timeout", 1).getResultList();

数据库任务在返回值之前需要 5 秒,但在所有情况下,都没有错误发生。

谁能告诉我如何设置查询超时?

【问题讨论】:

您可以尝试在查询数据库的方法上添加@Transactional(timeout = 1) 吗?请注意,方法必须是public 感谢您的回答。我试过了,它的工作。 exption 发生:org.hibernate.TransactionException: Unable to commit against JDBC Connection ... ORA-12592: TNS:bad packet .... 但是为什么例外是:“ORA-12592: TNS:bad packet”而不是“ORA-01013: user requested cancel of current operation”? 嗯,这很奇怪,你可以尝试放弃PlatformTransactionManager 的使用吗? &使用弹簧数据 jpa 的适当存储库或查询? & 删除您添加的任何其他额外配置以强制超时,只需在 vanilla spring data jpa 上使用 @Transactionaltimeout 【参考方案1】:

您可以尝试使用最简单的解决方案,即使用@Transactional 中的timeout 值;

@Transactional(timeout = 1) // in seconds (so that is 1 second timeout)
public Foo runQuery(String id) 
    String result = repo.findById(id);
    // other logic

请注意,带有@Transactional 注释的方法必须为public 才能正常工作

【讨论】:

感谢您的回答。使用那个 Anonation 后,查询已经超时,出现的异常是“ORA-12592: TNS:bad packet” 然后我把 System.setProperty("oracle.net.disableOob", "true"); .现在它可以正常使用异常抛出:“ORA-01013:用户请求取消当前操作” @user3611168 我明白了,我也看到了那个解决方案,但是考虑删除像 PlatformTransactionManager 这样的奇怪结构并使用适当的 spring data jpa 功能,那么您可能不需要设置该属性 我在使用您的建议时删除了所有其他配置,谢谢。我的问题已经解决了。

以上是关于Spring boot Oracle JPA 设置 QueryTimeout的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + 调度程序 + Spring Data JPA + Oracle 中的异常处理

spring boot2+jpa+thymeleaf增删改查例子

Spring Boot,Spring Data JPA多数据源支持配置

Spring boot , Spring data JPA 并发访问

Spring Boot/JPA:引用的保留字列名不起作用

如何为批量插入配置spring boot和data jpa