Установка тайм-аутов на подготовленные заявления - PullRequest
5 голосов
/ 04 августа 2010

Я пытаюсь использовать подготовленные операторы, которые работают с базой данных, расположенной довольно далеко, существует значительная задержка и ненадежность сетевого соединения, используемого для доступа к этой базе данных. Время простоя до минуты распространено. Проблема в том, что в случае такого сбоя, если моя программа пытается выполнить какой-либо подготовленный оператор, весь поток уходит в бесконечное ожидание. Он никогда не прерывается и просто застревает, ожидая ответа от базы данных.

Я пытался использовать метод setQueryTimeout () , чтобы явно установить тайм-аут для выполнения, но, похоже, есть некоторая проблема с этим методом, из-за которой он не может работать должным образом в случае сбоя сети.

Есть ли альтернативный способ обойти это?

1 Ответ

3 голосов
/ 04 августа 2010

Насколько мне известно, такой альтернативы нет, если сама сеть выходит из строя.

Точные детали setQueryTimeout включают в себя указание драйверу JDBC отправить внеполосный сигнал (по крайней мере, в случае OracleДрайвер JDBC) к базе данных, чтобы остановить выполнение подготовленного оператора;эта часть важна, так как зависит от поддержки, встроенной в драйвер и базу данных.После этого это зависит от базы данных, чтобы запланировать выполнение этой операции отмены;это может занять некоторое время, если необходимо откатить вещи или выполнить другие транзакции и т. д.

Учитывая первую часть характера реализации, весьма маловероятно, что «чистая» реализацияфункция тайм-аута может быть установлена.Возможно, вы захотите исследовать использование менеджера транзакций здесь (возможно, JTA), но я не уверен, что встретится с другим набором странных исключений (например, эвристических исключений).

Добавление

Использование монитора потоков, который отслеживает выполнение других потоков и убивает «зависшие» потоки, может быть плохой идеей. Этот вопрос SO поможет ответить на вопрос, почему следует избегать такой деятельности.Это также тактика , выбранная WebLogic Server .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...