Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прервать выполнение запроса fibplus [Firebird 1.5]


Mexikan ©   (2003-09-09 20:17:00) 

Есть ли возможность прервать выполнение тяжеловесного запроса запроса? Боюсь что выполнение его в отдельном потоке и уничтожение этого потока если он работает слишком долго только усугубит ситуацию. Хочеся каким нибудь асинхронным спомсобом оборвать выпронение этого запроса в базе данных, и коректно разрушить (или освободить (free)) обьекты tquery (или подобные).

Для связи с сервером бд использую fibplus 4.8.1.


Mexican   (2003-09-10 14:36:00) [1]

чтото непонятно написал :)
реализация вашего решения требует изменения запроса.


Mexican   (2003-09-10 14:33:00) [2]

Alexandr © (10.09.03 11:35) [15]
реализация вашего решения нужно изменять запрос.
Мне же необходима универсальная вещь.


Alexandr   (2003-09-10 11:35:00) [3]

давайте не будем вспоминать про IB7 т.к. возможность снятия запросов появилась еще в IB6.5 но то, как она там реализована может привести к порче БД.

а я тему на рубил, я наоборот предложил нормальное решение.


Alexandr   (2003-09-10 11:33:00) [4]

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

вот так вот...


Жук   (2003-09-10 11:17:00) [5]


> Alexandr © (10.09.03 11:04) [10]
> where exists(select 1 from RDB$database where gen_id(break_generator,0)=1)

А если сделать отдельный поток и оттуда поменять значение генератора ? Тогда и без ХП можно обойтись...


Mexican   (2003-09-10 11:11:00) [6]

Какой же вы александр упорный, такую тему зарубили :(, ну кто мне теперь ответит как прервать запрос если вы увели в дебри еще натретьем посте :(
Уперлись вот в идеальность програмиста.
Сравнение
"Зачем вам ремни безопасности водители проходят обучения, и ошибки тут недопустимы!".


Zacho   (2003-09-10 11:09:00) [7]


> Mexican (10.09.03 10:48) [9]

Нормально такая возможность реализована пока только в IB 7.
Так что если у тебя не IB 7, то единственный действительно нормальный способ - SP, все остальное может привести к разного рода неприятностям, включая повреждение БД.
Кстати, абсолютно согласен с Alexandr © - "А разработчика близко нельзя подпускать к рабочей БД." Для экспериментов, отладки, наращивания функциональности и т.п. у разработчика должна быть своя отдельная БД на отдельном сервере IB.


Alexandr   (2003-09-10 11:04:00) [8]

нет надо все исправления и всю новую функциональность проверять на тестовом сервере, на тестовой БД.
А не на рабочей.

А пользователя надо ограждать от неправильных действий.

where exists(select 1 from RDB$database where gen_id(break_generator,0)=1)


Mexican   (2003-09-10 10:48:00) [9]

Все ясно Саш, я понял с первого раза, отладчики не нужны, наращивать фенкциональность не надо, все надо писать разом и на века, оошибок вы ни когда не делаете.

Я же ошибки делаю, как впрочем и пользователь. Все не предугадаеш. Так что возмодность прерывать запрос нужна.


Alexandr   (2003-09-10 10:34:00) [10]

какие ошибки могут повесить сервер?
ошибки разработчика.
А разработчика близко нельзя подпускать к рабочей БД.
И тестировать надо свои программы...

Если этот способ тебе не подойдет, то нафига тебе код? Ну придумай сам. Кстати, SP необязательно, можно и в большинство обычных запросов.

fibplus тут нипричем. Все дело в сервере.


Mexican   (2003-09-10 10:29:00) [11]

Alexandr © (10.09.03 07:54) [4]

1) запросы НЕ должны быть тяжеловесными.

Я это знаю, но так же возможны ошибки которые могут повесить сервер. Перезегружать сервер у меня возмажности не будет поскольку я хочу использовать forcedwrites + ups (прошу вас не углубляться в обсуждение данного вопроса, а вернуться к первоначальной теме)

2) Использовать SP. В них можно корректно прерывать запрос.

Думаю что этот способ мне не подойдет, тем не менее код в студию :).

----
Так что fibplus не уменяят прерывать запросы во время выполнения?


Alexandr   (2003-09-10 09:17:00) [12]

с помощью генератора, вестимо...


Жук   (2003-09-10 08:34:00) [13]


> Alexandr © (10.09.03 07:54) [4]
> 2) Использовать SP. В них можно корректно прерывать запрос.

Это как же ?


Alexandr   (2003-09-10 07:54:00) [14]

1) запросы НЕ должны быть тяжеловесными.
2) Использовать SP. В них можно корректно прерывать запрос.


don-do   (2003-09-10 06:23:00) [15]

Принудительный разрыв коннекта на больших запросах происходит довольно часто. Например пользователь передумал дожидаться результата и убил прогу, а сервер продолжает выполнять задачу.
Для решения такой задачи приходиться использовать классик-сервер, т.к. он позволяет убить процесс, не роняя сервера, это конечно не есть хорошо, но другого выхода я не вижу. Так-же это дело можно автоматизировать, т.е. бить безхвостые процессы на сервере каким-либо демоном. Если же этого не делать то по крайней мере на IB4 эти процессы могли висеть до перезагрузки.


Mexikan   (2003-09-10 01:07:00) [16]

Suntechnic © (10.09.03 00:35) [1]
:) справку я копал в первую очередь, потом убил пару часов на инет, к сожалению инфа там крайне однообразная, каждый вася пупкин пытается скопировать faq с www.ibase.ru на свой сайт, как жаль что в поисковике нелязя сделать distinct %(

При поиске в справке asynchronous выдается 6 результатов. Все они относятся к events и forcedwrites.

Я уверен что такая инфа где то есть, вот только где?
Эх замучился уже. :( пойду спать утро вечера мудренее.

PS В принципе можно было бы поиграться напрямую с клиентской библиотекой, ведь хендлы транзакции и бд у меня есть, но к сожалению я пользуюсь триально бесплатной версией (без исходников).

PPS IBExpert в своем мониторе при обрыве выполнения запроса показывает "hard commit". эх знать бы как его сделать. К стати ibexpert рульная софтина и для русских бесплатна, разбогатею, обязательно куплю. :)


Suntechnic   (2003-09-10 00:35:00) [17]

Почитай в документации поддерживается ли асинхронная работа с бд, там и найдёшь ответ на свой вопрос. А на счёт отдельного потока и его уничтожения ты прав на все 100. Плохая это идея.


Наверх

Титульная страница Поиск, карта сайта Написать письмо