Параметры тайм-аута запроса JPA игнорируются, но аннотация @Transaction работает - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу, чтобы запросы JPA, сделанные моим приложением Spring Boot к базе данных Postgres, истекали через 5 секунд.

Я создал этот 20-секундный запрос для проверки тайм-аутов:

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

Iзадали следующие свойства в application.config:

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

Но время ожидания запроса не истекает через 3 с или 5 с (выполнение все равно занимает 20 с).

Странно, если я аннотируюslowQuery с @Transactional(timeout = 10), время ожидания истекает через 10 с или около того.

Я бы предпочел не комментировать каждый запрос.Я использую JPA 2.0 и пул соединений Tomcat.

Какая магия требуется для того, чтобы тайм-аут работал, просто установив их в файле свойств приложения?

1 Ответ

0 голосов
/ 25 апреля 2019

Чтобы сделать общее время ожидания общим, в вашей JpaConfiguration при объявлении компонента PlatformTransactionManager вы можете установить время ожидания транзакций по умолчанию:

@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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...