【发布时间】: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 上使用@Transactional和timeout
标签: oracle spring-boot spring-data-jpa ojdbc