Остановка выполнения запроса Zeos на Oracle

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Остановка выполнения запроса Zeos на Oracle

Сообщение rellai2 » 28.11.2016 09:43:13

Нужно выполнить асинхронный запрос(когда он получает данные а форма в этот момент не блокируется, идет подсчет времени выполнения запроса и пользователь может продолжать работать с бд)
Не нашел свойства там для асинхронного выполнения запроса. поэтому сделал все через поток.
На самой форме лежит конекшен и tzReadOnlyQuery. по нажатии кнопки создается поток и он активирует конекшн и начинает выполнение запроса.
Так вот мне нужно чтобы по нажатию на другую кнопочку все это дело перестало выполняться. Пытался сделать tzReadOnlyQuery.cancel и tzReadOnlyQuery.close вылетают ошибки.
делаю freeandnil(tzReadOnlyQuery) потом создаю, приложение может вообще упасть после повторного запуска запроса..
если убить конекшен то вылетает ошибка ORA-03114(не понятно откуда - на той машине отладить не могу).

Вообщем как правильно остановить выполнение запроса?
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение serbod » 28.11.2016 10:13:29

Я в свое время не смог это сделать красиво, поэтому просто запускал новый поток с запросом, а старый игнорировал.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение rellai2 » 28.11.2016 10:33:22

Блин, не есть гуд....запросы могут быть очень тяжелыми.
и если пользователь будет там раз 10 запускать ... :)
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение Снег Север » 28.11.2016 12:42:52

Сразу предупреждаю, что с Oracle практически не работал, но видел, что там есть kill session по ее id, аналогично MySQL. По-моему это единственный способ убить слишком долгий запрос.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение olegy123 » 29.11.2016 10:14:08

rellai2 писал(а):Не нашел свойства там для асинхронного выполнения запроса. поэтому сделал все через поток.

Верно.


rellai2 писал(а):Вообщем как правильно остановить выполнение запроса?

Может правильнее вообще выделить выполнение в отдельное подключение ZConnection(TOracleConnection) и его вырубать..
Я думаю - при разрыве конекшена в движок БД заложено торможение всех запросов связанных с потерянным клиентом.

Добавлено спустя 7 минут 31 секунду:
Возможно в dll-ках есть функции которые работают с работающими/зависшими запросами. а в Zeos их не стали выводить из-за усложнения в реализации общего для всех функционала.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение serbod » 29.11.2016 10:53:48

Там какая-то засада с открытыми сессиями, даже при нормальной работе они где-то на сервере (?) накапливаются и их нужно периодически подчищать. Я не DBA, пытался со стороны клиента это как-то решить, но ничего не получилось. Zeos, кстати, довольно хреново работает с Ораклом, я под себя делал правки, и с разработчиками переписывался, они даже предлагали мне взяться за поддержку Оракла. Были планы по добавлению поддержки OCILIB (нужн был клиент под процессоры ARM).. Но у меня ситуация на работе поменялась и я больше с ораклом не контактирую. Но если вам с ораклом предстоит долго работать, то рекомендую заняться портированием OCILIB, ибо родные дрова это страх и ненависть.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение rellai2 » 29.11.2016 11:30:25

конекшена в движок БД заложено торможение всех запросов связанных с потерянным клиентом

при разрыве конекшена все идет вразнос вплоть до закрытия приложения.
если тормозить поток или удалть то приложение зависает..
сейчас пробую через 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;
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Остановка выполнения запроса Zeos на Oracle

Сообщение olegy123 » 29.11.2016 14:55:31

Да, я про Disconnect говорил..
Но если вываливает эксепшен - то это не совсем хорошо.. Особенно для 24/7/365 сервисов..
Возможно для связи в dll запускается трейд и при Disconnect он валится вызывая эксепшен.. Если в либлах этот фактор предусмотрели - то хорошо.. А если.. будет ли расти память у приложения - тогда явно есть утечки в памяти..

тогда один вариант получит ID сесии и завершать "kill session ID"..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru
cron