2013-02-19 3 views
3

В SQL Developer нажатие кнопки «Отменить задачу» останавливает выполнение запроса. Я должен реализовать ту же функциональность в нашем проекте.Как работает «отменить запрос» в SQL Developer

cancel query iamge

Я использую BC4J в качестве инструмента ORM для выполнения запросов. Мне нужно отменить выполнение поискового запроса, называемого объектами просмотра thorugh, который вызывает несколько функций/процедур базы данных, чтобы получить результат.

Я пробовал использовать viewObject.cancelQuery();, но это не имеет никакого эффекта; запрос продолжает выполнять до конца.

Я подключен через соединение JDBC, используя BC4J.

+0

Какое сообщение об ошибке вы получаете? – Incognito

+0

Я предполагаю, что это 'KILL' процесс непосредственно, как в MySQL. –

+1

@ bmorris591 не убивает. Отмена запроса. Сессия не умирает. –

ответ

2

Мое предложение

  • Когда запрос передается
    • блок любая команда UI принять «отменить» (самый простой способ: использовать модальный диалог для этой цели, более удобной для пользователей удобно: блокировать только местные команды просмотра)
    • Запуск запроса в отдельном потоке, отличном от потока пользовательского интерфейса, использовать Runnable реализации которого
      • имеет свой собственный метод, который cancel()
        • звонки cancelQuery соответственно. cancel вашего запроса
        • сигнализирует это событие, выполнив ваш запрос с использованием <query thread>.interrupt(); для этого вам нужно сохранить ссылку на свою цепочку запросов в <query thread>. Этот сигнал иногда прерывается активными операциями ввода-вывода!
      • способен справиться с InterruptedException и SQLException в run(): если эти исключения перехваченных откат транзакции (если один запускается вообще для чтения только запрос)
      • , если есть несколько операторов давно работает в этом исполняемым затем проверить Thread.currentThread().isInterrupted() после каждого оператора, cancel() если результат верен
  • по окончанию запроса синхронизации своих результатов с UI
  • на отмените:
    • вызова cancel() вашего запрос работоспособного
    • забыть нить (но убедитесь, что не исчерпывают системные ресурсов или ваш пул соединений, если слишком много отмененных нитей до сих пор еще не завершено)
    • Unblock ваш UI

Есть вспомогательные классы Swing, а также в Eclipse RCP, которые поддерживают этот проект.

Смежные вопросы