2009-09-07 2 views
2

Можно ли указать время соединения/запроса для запросов базы данных Oracle? Либо на стороне Oracle, либо в драйвере Oracle JDBC (10.2.0.4)? Итак, этот клиент Java только что получил ошибку после, скажем, 2 минуты вместо ожидания, пока Oracle не завершит выполнение запроса?Oracle connection/query timeout

ответ

4

Если вы выполняете запрос в контексте транзакции, значение тайм-аута транзакции монитора транзакций JTA будет определяющим для тайм-аута запроса. Конфигурация для этого зависит от одного сервера приложений к другому.

На индивидуальном уровне запросов (при отсутствии монитора транзакций JTA) метод setQueryTimeout может использоваться для установки таймаута при выполнении объекта Statement/PreparedStatement/CallableStatement.

Update

setQueryTimeout не следует полагаться, хотя он работает (по крайней мере от клиента J2SE). Он работает через драйвер JDBC, выполняющий полный раунд на сервер базы данных Oracle. Затем, чтобы база данных прекратила выполнение запроса, база данных. Не полагайтесь на нее для приложений с критическими сроками.

+1

У нас возникли проблемы с тайм-аутом JTA, так как он не влияет на текущий запрос. И на самом деле сервер WebLogic, который мы запускаем, пытается убить длинное соединение и создает другой поток, чтобы его убить, но он удаляет блокировку Java в драйвере JDBC Oracle, тем самым заставляя оба потока ждать. Проблема становится еще хуже, так как WebLogic пытается создать еще больше killer-threads и в конечном итоге исходит из них. –

+0

Точка о setQueryTimeout кажется очень интересной, и я не думал об этом до экстренной помощи :). Нам все равно, если setQueryTimeout займет некоторое время, чтобы отменить запрос, главное здесь - результат :). Я вернусь к результатам теста. –

+1

Причина setQueryTimeout() может не работать в WLS, тем более из-за JTA. Я не думаю, что драйвер будет отвечать на вызовы setQueryTimeout в контексте транзакции, но я могу быть некорректным. –

2

Посмотрите на профили Oracle. Это позволяет указать несколько ограничений на уровне базы данных. Одним из них является максимальное время процессора для каждого запроса.

Если у вас есть вопросы, которые могут быть выполнены более 2 минут на регулярной основе, вы можете сначала выполнить некоторую настройку своих запросов.

+0

Профили Oracle влияют на все запросы пользователя. OP может заинтересовать только один конкретный запрос, который необходимо отменить. –

+1

Но это будет работать как решение грубой силы ;-) –

+0

Профили Oracle станут нашим следующим шагом, если setQueryTimeout не будет работать :). –