Как снять длительный запрос ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Как снять длительный запрос ?

Сообщение Juice » 21 июл 2005, 16:27

В отдельном потоке выполняется длительный запрос к ХП :

Код: Выделить всё

TMyThread.Execute;
begin
 DataSet.Open;
end;
Как можно корректно остановить выполнение этого запроса из другого потока?
Компоненты: IBX
Сервер : Firebird 1.0.3

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Re: Как снять длительный запрос ?

Сообщение Slava Ekimov » 21 июл 2005, 17:20

Juice писал(а):В отдельном потоке выполняется длительный запрос к ХП :

Код: Выделить всё

TMyThread.Execute;
begin
 DataSet.Open;
end;
Как можно корректно остановить выполнение этого запроса из другого потока?
Компоненты: IBX
Сервер : Firebird 1.0.3
Раньше надо было думать, на этапе написания процедуры!

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Сообщение Juice » 21 июл 2005, 17:49

Раньше надо было думать, на этапе написания процедуры!
Вы что никогда не занимались программированием, а только сидели и 'думали' ? Во-первых, с чего вы взяли что написал процедуру я? Во-вторых, кто сказал что процедура не может быть длительной? В-третьих, что с точки зрения клиентской стороны изменится если вместо процедуры будет просто долгий запрос к таблицам БД? В-четвертых, я точно знаю что ответ на мой вопрос есть, просто я его не знаю и уже долго не могу решить самостоятельно этот вопрос.
http://www.delphimaster.ru/cgi-bin/foru ... 886461&n=0

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 июл 2005, 18:00

уже долго не могу решить самостоятельно этот вопрос
а не надо этот вопрос пытаться решать абы где.

сие, то есть "снять выполнение запроса", можно только в InterBase 6.5 через IB API или в InterBase 7.x через временные системные таблицы. В остальных версиях IB/FB/YA запрос можно снять только в Classic посредством убиения клиентского процесса на сервере.
В отдельном потоке выполняется длительный запрос к ХП :
надеюсь, что и с отдельным IBDatabase для этого потока.
Перерыл весь сайт, ничего не нахожу.
как именно рыл? я вот, как дурак, в поиске пишу "снять запрос", и первый же документ содержит описание, как.

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Сообщение Juice » 25 июл 2005, 16:19

Таким образом даже в новейших firebird такой поддержки нет? Для меня это очень существенно. Я выполняю все open в отдельном потоке, а что делать если пользователю надоело ждать ? Вообще говоря я таки смог использовать terminatethread, однако это очень ненадежная штука и уже как мне кажется начинают появляться утечки памяти. Есть еще вариант - пользователю надоело ждать - он закрыл форму, но поток с запросом продолжает выполняться а юзер об этом не знает. Но этот вариант сопряжен с множеством проблем архитектуры приложения да и вообще как-то не красиво получается... Может вы что-то посоветуете, интересно , если такая возм. есть только в новейших версиях то как решали эту проблему раньше ?
надеюсь, что и с отдельным IBDatabase для этого потока.

Нет, не с отдельным, однако я имею 100%-ую гарантию что с компонентами доступа к БД в это время другой поток не работает. Это ошибка?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июл 2005, 16:25

Я выполняю все open в отдельном потоке, а что делать если пользователю надоело ждать ?
я не понял, ты faq читал, или нет? www.ibase.ru/ibfaq.htm
Может вы что-то посоветуете, интересно , если такая возм. есть только в новейших версиях то как решали эту проблему раньше ?
обычно ее решают очень простым способом - проектируют БД и пишут запросы так, чтобы любой запрос не выполнялся более 5-ти минут. А если это оч. сложный запрос - то не более 15-ти минут.
Нет, не с отдельным, однако я имею 100%-ую гарантию что с компонентами доступа к БД в это время другой поток не работает. Это ошибка?
это ошибка, потому что в этом нет никакого смысла. Кой толк в этом параллельном thread если он все равно блокируется?

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Сообщение Juice » 25 июл 2005, 16:49

A: Начиная с IB 4.2 клиентская часть IB поддерживает параллельное выполнение операций в разных коннектах. Т.е. для того чтобы работать параллельно из приложения, надо в каждом thread приложения (там где это нужно) открыть свое соединение (TIBDatabase для IBX, для BDE см. пример BKQUERY в поставке Delphi и C++Builder).
Получается, что мне надо в каждом потоке создавать TIBDatabase ? Потоковая функция у меня такая: procedure DoQuery(ds : TIBCustomDataSet);
И в теле процедуры ds.DataBase := ThreadDB ;
ds.Open ?
В чем логика этого геморроя ? Open не содержит не одного параметра, тут даже стек потока не подключается, а TIBDatabase тоже в стеке не должна лежать а в куче. И почему я делю один TIBDatabase между потоками и все нормально работает ? Извините, не понимаю, а на веру такие вещи опасно принимать - рано или поздно боком вылезет.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июл 2005, 17:02

Получается, что мне надо в каждом потоке создавать TIBDatabase ?
слушай, сейчас ведь забаню нафиг.

www.ibase.ru/ibfaq.htm
www.ibase.ru/devinfo/ibx.htm
И почему я делю один TIBDatabase между потоками и все нормально работает ? Извините, не понимаю, а на веру такие вещи опасно принимать - рано или поздно боком вылезет.
очевидно, потому что у тебя НЕТ НИКАКОГО ПАРАЛЛЕЛЬНОГО ВЫПОЛНЕНИЯ.
Если на веру не принимаешь, то разве сложно понять, что ОДИН КОННЕКТ, или сокет, НЕ МОЖЕТ использоваться разными тредами параллельно. Ферштейн? Ну не может он, НЕ МОЖЕТ. Если синхронизировать - может, но тогда нет параллельного выполнения тредов.
Чего дурака валять - посмотри примеры по ссылкам. А то точно забаню нафиг....

:evil:

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Сообщение Juice » 25 июл 2005, 17:12

Спасибо, понял зачем эт, только мне не надо.
:roll: Все, сматываюсь :-#

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июл 2005, 17:19

ну и славно, трам-пам-пам. только все равно пока в FB нет возможности "снять" запрос. увы.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 июл 2005, 17:57

kdv писал(а):ну и славно, трам-пам-пам. только все равно пока в FB нет возможности "снять" запрос. увы.
Вот интересно - а почему мне такой фичи не хочецо вовсе? Да и 90% программеров, проработавших с сервером плотно больше пары лет? Что-то мысли в сторону консерватории пошли... философический настрой у меня сегодня...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июл 2005, 18:27

да хочется, хочется. вот и в ib 7.x сделали, что можно. а в 6.5 была реализация "через зад". в FB ее делать не стали.

кроме того, в классике это "неможно". теоретически можно, но сложно. ибо надо сигнализировать например lock manager-у, а все процессы должны регулярно проверять - не сказали ли им обломиться.

в FB 2.0 появляется нечто вроде "временных системных таблиц", только иное. как там будет со снятием запросов - я пока не знаю.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июл 2005, 18:29

добавлю насчет консерватории - я тебе серьезно говорю, что когда запрос выполняется пол-часа, это уже ненормально. То есть, вместо того чтобы делать отчеты по оперативным данным, их надо суб-агрегировать. То есть, уменьшать число обсчитываемых данных. Перефразируя, задача превращается не в "снятие долгоиграющих запросов", а в "быстрое выполнение запросов". Соответственно, необходимость "снятия" отпадает как таковая.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 27 июл 2005, 04:19

а процесс или поток, как угодно, валить не пробовали
с коннектами и прочей ерундой
о пусть сервак сам разбирается с зависшими коннектами....

Broom
Сообщения: 8
Зарегистрирован: 27 окт 2004, 10:02

Сообщение Broom » 01 авг 2005, 09:11

kdv писал(а):добавлю насчет консерватории - я тебе серьезно говорю, что когда запрос выполняется пол-часа, это уже ненормально. То есть, вместо того чтобы делать отчеты по оперативным данным, их надо суб-агрегировать. То есть, уменьшать число обсчитываемых данных. Перефразируя, задача превращается не в "снятие долгоиграющих запросов", а в "быстрое выполнение запросов". Соответственно, необходимость "снятия" отпадает как таковая.
Вставлю свои 5 коп., если позволите. Можно в тяжелом запросе использовать обращение к специально для этого созданному генератору. Тогда, чтобы запрос прекратил свое выполнение, нужно дернуть генератор. Работает, но несколько перанально все же...

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 15 дек 2006, 11:25

Добрый день, господа!

Просмотрел, все, что относится к данному subj'y,
однозначного ответа на вопрос так и не получил...

Предлагаю реанимировать данную тему!
в FB 2.0 появляется нечто вроде "временных системных таблиц", только иное. как там будет со снятием запросов - я пока не знаю.
Версия 2 вышла.
Что с прерыванием длительного запроса с клиента теперь?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 дек 2006, 11:37

Kyarginski писал(а):Что с прерыванием длительного запроса с клиента теперь?
Проблема имхо из пальца высосана.
Не бывает процедур со штатной возможностью прерывания.
А если бывает, то в них такие функции встраиваются. Таймаутом и/или генератором.
И не надо "ля-ля", что это проктология. Удобно и функционально. Могу пример привести.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 дек 2006, 12:41

Kyarginski писал(а):Версия 2 вышла.
Что с прерыванием длительного запроса с клиента теперь?
То же самое - ничего. Посмотри на 2.1, там вроде бы есть.

Kyarginski
Сообщения: 36
Зарегистрирован: 12 дек 2006, 12:59

Сообщение Kyarginski » 15 дек 2006, 13:34

Посмотри на 2.1, там вроде бы есть.
О!
А где взять 2.1? Подскажите?
Проблема имхо из пальца высосана.
Не бывает процедур со штатной возможностью прерывания.
А если бывает, то в них такие функции встраиваются. Таймаутом и/или генератором.
И не надо "ля-ля", что это проктология. Удобно и функционально. Могу пример привести.
Про "высосанную из пальца" проблему - не согласен!
Примеры всегда приветствуются!!!

А задача следующая.

Инструментарий: Delphi + IBX.

Есть два запроса на форме :
  • первый отбирает собственно данные;
    второй подсчитывает кол-во строк данных: count(*), для показа пользователю и для изменения размера полосы прокрутки VerticalScroll.
Так вот - первый запрос возвращает начальную порцию данных достаточно быстро, а второй требует времени, и большого, в общем случае.
Если пользователь захотел отобрать новую порцию данных - перезапускаем 1-й запрос, но 2-й то ещё работает (считает кол-во)?!
Надо его прервать!
И вот, как это сделать, чтобы не терялась память и т.п.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 дек 2006, 13:50

А мож таки проще не заниматься хернёй? А тратить умственные усилия на то, чтоб запросы летали мухами и миллионых резалтсетов не получалось?

Ответить