Весенняя загрузка Oracle JPA установлена ​​QueryTimeout - PullRequest
2 голосов
/ 19 сентября 2019

Я использую Spring Boot с Ojdbc8 18.3.0.0.0. С Hikari Datasource и 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 секунд перед возвращаемым значением, но в любом случае ошибка не возникает.

Может кто-нибудь сказать мне, как установить время ожидания запроса?

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете попробовать использовать самое простое решение, которое использует значение timeout в пределах @Transactional;

@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 для правильной работы

...