我想要我的春季启动应用程序对Postgres数据库进行5秒后的jpa查询。
我创建了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
但是查询在3s或5s之后不会超时(仍需20秒才能执行)。
奇怪的是,如果我用@Transactional(timeout = 10)
注释slowQuery
,则在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;
}