Нужно выполнить асинхронный запрос(когда он получает данные а форма в этот момент не блокируется, идет подсчет времени выполнения запроса и пользователь может продолжать работать с бд)
Не нашел свойства там для асинхронного выполнения запроса. поэтому сделал все через поток.
На самой форме лежит конекшен и tzReadOnlyQuery. по нажатии кнопки создается поток и он активирует конекшн и начинает выполнение запроса.
Так вот мне нужно чтобы по нажатию на другую кнопочку все это дело перестало выполняться. Пытался сделать tzReadOnlyQuery.cancel и tzReadOnlyQuery.close вылетают ошибки.
делаю freeandnil(tzReadOnlyQuery) потом создаю, приложение может вообще упасть после повторного запуска запроса..
если убить конекшен то вылетает ошибка ORA-03114(не понятно откуда - на той машине отладить не могу).
Вообщем как правильно остановить выполнение запроса?
Остановка выполнения запроса Zeos на Oracle
Модератор: Модераторы
Блин, не есть гуд....запросы могут быть очень тяжелыми.
и если пользователь будет там раз 10 запускать ...
и если пользователь будет там раз 10 запускать ...
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Сразу предупреждаю, что с Oracle практически не работал, но видел, что там есть kill session по ее id, аналогично MySQL. По-моему это единственный способ убить слишком долгий запрос.
rellai2 писал(а):Не нашел свойства там для асинхронного выполнения запроса. поэтому сделал все через поток.
Верно.
rellai2 писал(а):Вообщем как правильно остановить выполнение запроса?
Может правильнее вообще выделить выполнение в отдельное подключение ZConnection(TOracleConnection) и его вырубать..
Я думаю - при разрыве конекшена в движок БД заложено торможение всех запросов связанных с потерянным клиентом.
Добавлено спустя 7 минут 31 секунду:
Возможно в dll-ках есть функции которые работают с работающими/зависшими запросами. а в Zeos их не стали выводить из-за усложнения в реализации общего для всех функционала.
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
Там какая-то засада с открытыми сессиями, даже при нормальной работе они где-то на сервере (?) накапливаются и их нужно периодически подчищать. Я не DBA, пытался со стороны клиента это как-то решить, но ничего не получилось. Zeos, кстати, довольно хреново работает с Ораклом, я под себя делал правки, и с разработчиками переписывался, они даже предлагали мне взяться за поддержку Оракла. Были планы по добавлению поддержки OCILIB (нужн был клиент под процессоры ARM).. Но у меня ситуация на работе поменялась и я больше с ораклом не контактирую. Но если вам с ораклом предстоит долго работать, то рекомендую заняться портированием OCILIB, ибо родные дрова это страх и ненависть.
конекшена в движок БД заложено торможение всех запросов связанных с потерянным клиентом
при разрыве конекшена все идет вразнос вплоть до закрытия приложения.
если тормозить поток или удалть то приложение зависает..
сейчас пробую через kill_session сделать...
Добавлено спустя 1 час 43 минуты 50 секунд:
Снег Север писал(а):Сразу предупреждаю, что с Oracle практически не работал, но видел, что там есть kill session по ее id, аналогично MySQL. По-моему это единственный способ убить слишком долгий запрос.
СПАСИБО! то что надо
если так делать то нормально более менее работает..
правда чтобы ошибка не вылетала потом при повтопном запуске запроса нужно сделать так
потому, что в таком случае Disconnect не с первого раза срабатывает а вызывает эксепшн
Код: Выделить всё
while e do
begin
try
e := false;
Application.ProcessMessages;
tmpFrm.OracleConnection.Disconnect;
except
e := true
end;
end;Да, я про Disconnect говорил..
Но если вываливает эксепшен - то это не совсем хорошо.. Особенно для 24/7/365 сервисов..
Возможно для связи в dll запускается трейд и при Disconnect он валится вызывая эксепшен.. Если в либлах этот фактор предусмотрели - то хорошо.. А если.. будет ли расти память у приложения - тогда явно есть утечки в памяти..
тогда один вариант получит ID сесии и завершать "kill session ID"..
Но если вываливает эксепшен - то это не совсем хорошо.. Особенно для 24/7/365 сервисов..
Возможно для связи в dll запускается трейд и при Disconnect он валится вызывая эксепшен.. Если в либлах этот фактор предусмотрели - то хорошо.. А если.. будет ли расти память у приложения - тогда явно есть утечки в памяти..
тогда один вариант получит ID сесии и завершать "kill session ID"..
