Можно ли указать время соединения/запроса для запросов базы данных Oracle? Либо на стороне Oracle, либо в драйвере Oracle JDBC (10.2.0.4)? Итак, этот клиент Java только что получил ошибку после, скажем, 2 минуты вместо ожидания, пока Oracle не завершит выполнение запроса?Oracle connection/query timeout
ответ
Если вы выполняете запрос в контексте транзакции, значение тайм-аута транзакции монитора транзакций JTA будет определяющим для тайм-аута запроса. Конфигурация для этого зависит от одного сервера приложений к другому.
На индивидуальном уровне запросов (при отсутствии монитора транзакций JTA) метод setQueryTimeout может использоваться для установки таймаута при выполнении объекта Statement/PreparedStatement/CallableStatement.
Update
setQueryTimeout не следует полагаться, хотя он работает (по крайней мере от клиента J2SE). Он работает через драйвер JDBC, выполняющий полный раунд на сервер базы данных Oracle. Затем, чтобы база данных прекратила выполнение запроса, база данных. Не полагайтесь на нее для приложений с критическими сроками.
Посмотрите на профили Oracle. Это позволяет указать несколько ограничений на уровне базы данных. Одним из них является максимальное время процессора для каждого запроса.
Если у вас есть вопросы, которые могут быть выполнены более 2 минут на регулярной основе, вы можете сначала выполнить некоторую настройку своих запросов.
Профили Oracle влияют на все запросы пользователя. OP может заинтересовать только один конкретный запрос, который необходимо отменить. –
Но это будет работать как решение грубой силы ;-) –
Профили Oracle станут нашим следующим шагом, если setQueryTimeout не будет работать :). –
- 1. Oracle set lock timeout для сеанса
- 2. Ошибка TimeOut в Oracle Bpel 11g
- 3. SELECT query throws timeout
- 4. JQuery timeout timeout часть 2
- 5. LdapConnection timeout vs SearchRequest timeout
- 6. wait()/wait (timeout)/sleep (timeout)?
- 7. d3 timeout like angular $ .timeout
- 8. Oracle Data Change Notification Timeout и рабочий процесс
- 9. Команда powershell Timeout
- 10. Почему `timeout 2 timeout 1 bash` застрял
- 11. Heroku Timeout :: timeout не выдает ошибку
- 12. Python Timeout
- 13. Bonjour Timeout
- 14. BluetoothSocket.Connect Timeout
- 15. Timeout XMLHttpRequest
- 16. Sleep() Timeout
- 17. Transaction Timeout
- 18. QNetworkAccessManager timeout
- 19. SessionState Timeout
- 20. Captcha timeout
- 21. Javascript timeout
- 22. file_get_contents timeout
- 23. Activator.CreateInstance timeout
- 24. WebClient TimeOut
- 25. rqworker timeout
- 26. Sidekiq Timeout
- 27. WSAConnectByName timeout
- 28. DirectoryEntry Timeout
- 29. Cassandra TimeOut?
- 30. LocationListener timeout
У нас возникли проблемы с тайм-аутом JTA, так как он не влияет на текущий запрос. И на самом деле сервер WebLogic, который мы запускаем, пытается убить длинное соединение и создает другой поток, чтобы его убить, но он удаляет блокировку Java в драйвере JDBC Oracle, тем самым заставляя оба потока ждать. Проблема становится еще хуже, так как WebLogic пытается создать еще больше killer-threads и в конечном итоге исходит из них. –
Точка о setQueryTimeout кажется очень интересной, и я не думал об этом до экстренной помощи :). Нам все равно, если setQueryTimeout займет некоторое время, чтобы отменить запрос, главное здесь - результат :). Я вернусь к результатам теста. –
Причина setQueryTimeout() может не работать в WLS, тем более из-за JTA. Я не думаю, что драйвер будет отвечать на вызовы setQueryTimeout в контексте транзакции, но я могу быть некорректным. –