Форум: "Базы";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
ВнизОтмена выполнения запроса Найти похожие ветки
← →
ANB (2008-03-13 13:31) [40]
> Правильный_Вася (13.03.08 13:10) [38]
Скорее всего не будет работать.
Во время выполнения запроса сессия/коннект заняты и вызвать что то (чтобы установить сессионную переменную, про которые я в мс скл не слышал) именно для этой сессии не получится.
Плюс не факт, что исполнитель запросов отработает в таком режиме, даже если флаг останова подсунуть глобально через закомиченное изменение обычной таблицы. Плюс использование такой функции сильно тормознет выполнение запроса.
← →
ANB (2008-03-13 13:35) [41]
> Sergey13 © (13.03.08 13:29) [39]
Не наю. Но посмотри список сессий для девелопера. Видно, что на кажное окно - одна сессия. И при выполнении запросов тока статус меняется.
Впрочем, мона сделать и несколько сессий, если врубить распараллеливание, но это уже оракл сам делает, девелопер ни при чем.
Самое простое - посмотреть ОДАК. При наличии одной сессии, можно без проблем асинхронно выполнять запрос/блок (ожидая в цикле или модальной формой), и, если не подвесил интерфейс, без проблем срубить выполнение.
Правда, иногда бывают проблемы, т.е. не все запросы/блоки срубаются.
← →
sniknik © (2008-03-13 13:38) [42]> Кстати, в мс скл, если лезть через DBLib, тоже аккуратно все срубается.
у меня почемуто чувство, что ты опять о чемто не о том...
какая разница DBLib или ADO? и то и то внешние для сервера mssql обьекты, а запрос выполняется внутри... единственный возможный вариант снимать извне, это если реализовать внутри по ходу выполнения постоянный опрос внешних обьектов и реагировать на них... только подобная схема, добавит тормозов (существенных тормозов) к выполнению, и гораздо больших по сумме, чем изредка в исключительных ситуациях доделать ненужную уже работу...
mssql по твоему тормозной? отвлекается по ходу запроса на разные непонятные действия? если нет, то можеш это считать примером и доказательством... и перестать искать различные "волшебные" компоненты.
вот если бы, ты говорил не о запросе, а о процессе, то да чтото подобное можно (но не нужно. равнозначно "насильному" терминированию потока в программе), смутно припоминаю, это даже обсуждалось как то.
и гарантирую, от того что используется на клиенте (ADO/DBLib/...), эта возможность не исчезнет или добавится "волшебным" образом.
← →
sniknik © (2008-03-13 13:43) [43]> Тогда почему кнопочка убийства запроса доступна только при многосессионной настройке?
да, имхо, потому что там тоже самое что у mssql, просто процессы названы сессиями. разницы то. и "срубается" не запрос, а именно сессия/процес/поток (если "аналогиловать" с программой, поток извне "убить", процедуру/функцию в нем выполняющуюся отдельно нет (а вот по проверке внутри ее легко можно выйти).).
← →
sniknik © (2008-03-13 13:45) [44]sniknik © (13.03.08 13:43) [43]
> извне "убить"
... извне "убить" можно, ...
← →
sniknik © (2008-03-13 13:55) [45]вот, даже залез в хелп...
"убийство" потока ->
KILL SPID
если найдешь SPID запроса, то снимешь...
← →
DmitriyG. © (2008-03-13 16:44) [46]В том то и дело что
ADODataSet1.Close не закрывает асинхронным запрос, равно как и Cancel не помогает :-(
← →
sniknik © (2008-03-13 17:36) [47]> ADODataSet1.Close не закрывает асинхронным запрос
наверное у тебя ошибка в программе...
у меня вот все работает замечательно, хоть и на скорую руку (см. видео, в архиве rar - 36 кб. exe с базой посылать рука не подымается. за код стыдно (помойка от разных тестов))
http://webfile.ru/1801097
"твой" код из кнопкиprocedure TForm2.Button1Click(Sender: TObject);
begin
with Form1 do begin
ADODataSet1.Close;
Label1.Caption:= "0";
ProgressBar1.Position:= 0;
end;
Close;
end;
> равно как и Cancel не помогает :-(
сделай более глобально, Close всему коннекту...
← →
ANB (2008-03-13 17:49) [48]
> а именно сессия/процес/поток
да не срубается сессия ! посылается спец. команда "юзер запросил отмену текущей операции". Большей частью, если не сильно задумался, оракл на нее реагирует и генерит исключение (оно потом приезжает обратно на клиента).
> Close всему коннекту...
1. Скорее всего, пока коннект не закончит работу (выполнение запроса), коннект не будет выполнять эту команду
2. Это извращение - отконнекчиваться, теряя текущий контекст, для срубания запроса.
В QA все нормально и так работает. Жмешь кнопку и запрос снимается. Правда, не всегда.
← →
sniknik © (2008-03-13 18:04) [49]> 2. Это извращение - отконнекчиваться, теряя текущий контекст, для срубания запроса.
ну раз нормально "не помогает :-(", надо же чтото делать, пусть хоть так попробует, поучиться. глядиш и нормального способа "дорастет".
> Жмешь кнопку и запрос снимается.
аналогично. см. тест выше.
> Правда, не всегда.
всегда. (хотя... сколько раз "рубил" для статистики? сотню, две, ...? а я до пары десятков не дотянул... может все еще впереди)
← →
ANB (2008-03-14 11:31) [50]
> (хотя... сколько раз "рубил" для статистики? сотню, две,
> ...?
Сотен пять точно. Не для статистики - отлаживались. Иногда кнопку жмешь, а QA не сразу запрос рубит. Самая беда - выполнение сложной хранимки.
Впрочем, это года 2 назад было. Статистику точную - на каких именно операциях подвисает, не собирали. Возможно, сервер что то подчищал.
← →
ANB (2008-03-14 13:54) [51]Короче, провел эксперимент.
Условия :
коннечусь через АДО к ораклу (МС СКЛ нету, да и может и правда, не поддерживает он отмену запроса).
Запускаю асинхронно длительный запрос, возвращающий одну строку (коунт по большой таблице).
Делаю тоже самое в девелопере.
Запросу дал доработать и снимал его.
Результат :
1. Спец.команды снятия запроса в АДО нету.
2. Close датасету - не помогает. Т.е. отрубается фактически тока фетч. Запрос висит пока не выполнится, тока результата нету.
3. Пока запрос не выполнится, close коннекту делать низзя - ругается.
4. Девелопер снимает запрос практически мгновенно. Аналогично ведут себя ОДАК и ДОА. Генерится ошибка ОРА-01013.
Вывод, не удививший меня : АДО - гадость, лучше пользоваться родными компонентами под используемую СУБД.
← →
DmitriyG. © (2008-03-14 17:15) [52]To sniknik: можно посмотреть исходники для демо программы? У меня пока складывается тоже впечатление, что сделать отмену для MSSQL сервера не получится через ADO... (как у ANB не получается пока для Oracle).
ЗЫ А есть ли специальные компоненты для доступа к MSSQL?
← →
ANB (2008-03-14 18:17) [53]
> ЗЫ А есть ли специальные компоненты для доступа к MSSQL?
Я видел, но они кривоватые. Самое гибкое - через DBLib ломится. Но там библиотека, никаких компонентов. Короче, сильно непросто. Зато все работает асинхронно, срубается, ошибки ловятся ВСЕ и прочие полезности. Короче, один одному как QA пашет.
> (как у ANB не получается пока для Oracle).
а мне и не надо - я одаком и доа пользуюсь. там все и так получается без лишних проблем.
← →
sniknik © (2008-03-14 20:09) [54]> можно посмотреть исходники для демо программы?
ты его уже видел в [47]... если выкинуть весь мусор от других тестов, то это все что есть, ну вернее закрытие, а открытие это Open и ShowModal после него, как уже говорил (прогресс бар и остальное что там было, это артефакты от других проб, и к обсуждаемому не относятся)
а вообще нет, нельзя. и не потому, что на работе остался... даже в понедельник не дам, из принципа. ты вот не привел ни единой строчки своего кода, не проверил ни одного моего утверждения, не сказал ничего конкретного и т.д. поэтому для меня ветка из разряда "потрепательских" - т.е. треплемся, развлекаемся и никакого кода... (а то все веселье кончится)
сделай чтонибудь сам. докажи. тогда возможно и помогу.
> Зато все работает асинхронно, срубается, ошибки ловятся ВСЕ и прочие полезности.
т.е. ничего нового? и стоит парится и весь механизм работы с базами на функциях переписывать...
кстати, много кода с использованием DBLib написал?
← →
DmitriyG. © (2008-03-15 17:05) [55]Ну боюсь, то что приведено в [47] не будет работать для MSSQL сервера... В этом случае исходники не нужны....
Буду смотреть DBLib
← →
MsGuns © (2008-03-15 20:45) [56]>ANB (14.03.08 13:54) [51]
>1. Спец.команды снятия запроса в АДО нету.
Есть.
>2. Close датасету - не помогает. Т.е. отрубается фактически тока фетч.
Close исп-ся для открытого датасета, у нас же он еще как бы не открылся (запрос не выполнен)
>Запрос висит пока не выполнится, тока результата нету.
Уже писано было про синхрон/асинхрон - может стОит почитать хэлпы по ADO ?
>3. Пока запрос не выполнится, close коннекту делать низзя - ругается.
Разумеется. см. п.2 Close для коннекта аналогичен Close для запроса по смыслу. Для "снятия" используются в зависимости от контекста Cancel или RollBackTrans
>Вывод, не удививший меня : АДО - гадость, лучше пользоваться родными компонентами под используемую СУБД.
И что же мешает выкинуть "гадость" и пользоваться "родными" компонентами ?
← →
ANB (2008-03-17 09:29) [57]
> И что же мешает выкинуть "гадость" и пользоваться "родными"
> компонентами ?
Я так и сделал.
← →
ANB (2008-03-17 09:36) [58]
> Есть.
Какая ?
> Для "снятия" используются в зависимости от контекста Cancel
> или RollBackTrans
Тоже не ботает.
Cancel - игнорит
RollBackTrans - ругается, что транзакция не открыта
> кстати, много кода с использованием DBLib написал?
Не. Не особо надо было - я практически с мс скл не работаю, для минимальных потребностей АДО хватало.
Нужно было как то написать надежный исполнитель скриптов - пришлось после кучи экспериментов с АДО использовать DBLib. Примеры работы содрал у ребят из Нижегородского РНИВЦ (вот там зубры так зубры в мс скл, респект им большой)
← →
ANB (2008-03-17 09:40) [59]
> и весь механизм работы с базами на функциях переписывать.
> ..
Зачем ? У меня есть библиотека компонентов для работы с мс скл, основанная на DBLib. Правда, кривоватая. Если сильно надо будет - починю и буду юзать. Или найду свежую прямую версию и куплю.
Если сильно сильно припрет - напишу свою. Не так уж и сложно.
← →
sniknik © (2008-03-17 10:40) [60]> Тоже не ботает.
> Cancel - игнорит
если говоришь "не работает" приводи доказательства. у меня работает.
> пришлось после кучи экспериментов с АДО использовать DBLib
пока что, все "зубры" что мне встречались, те что "уходят" от ADO ищя "волшебных" возможностей в других технологиях, все попросту "не разобрались с управлением". ну а так как сам я считаю ADO простым, логичным и понятным... в общем мнение о таких специалистах у меня не очень.
(не путать с теми кого жизнь вынудила писать на чемто конкретном, у кого есть разумные причины, начал с другого. имеются ввиду только "поисковики" метающиеся от технологии к технологии только изза того что "чтото не получается", и виноватыми считают именно технологию/компоненты)
> RollBackTrans - ругается, что транзакция не открыта
ну так. если делаешь откат транзакции ее как минимум открыть надо... а вот как ты отреагируешь на совет уничтожить обьект(транзакцию) в дельфи? скажешь что ругается что обьект не существует?
не понимаю правда как он этим хотел решить вопрос, и проверять неохота, но раз уж делать то правильно. не так ли?
вообще это уже немного достает. вот пример (убрал лишнее и немного переделал и отмену и старт т.е. там теперь чуть больше кода чем приводил, но вы же и тот не осилили, куда вам дальше то. пишите свою, может разберетесь получше... )
http://webfile.ru/1807960 (exe в rar архиве, 340кб)
у меня естественно там свое, поменяйте строку коннекта и вносите свой запрос (не управляющую команду, а именно запрос), если ошибок нет должно выполнится.
строка коннекта ставится по кнопке run такwith ADOCon do
if ConnectionString <> EdComText.Text then begin
Close;
ConnectionString:= EdComText.Text;
end;
т.е. если изменений в строке нет то остается старый коннект, есть то переконектится даже если там пробел незначащий добавили.
← →
sniknik © (2008-03-17 11:08) [61]сорри, в прошлом примере глюк, не учел что прогресс в другом потоке, а я там "красоту навел" счетчик фетча обновляю и кнопки интерфейса дизейблю (т.е. фактически к VCL из потока пусть и неявного обращаюсь)... AV может быть.
замена
http://webfile.ru/1808019
← →
ANB (2008-03-17 11:50) [62]
> пока что, все "зубры" что мне встречались, те что "уходят"
> от ADO ищя "волшебных" возможностей в других технологиях,
> все попросту "не разобрались с управлением".
1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
2. Немного тяжелее с мс скл. Другой технологии, кроме АДО, мс и не предоставляет (DBLib - слишком низкоуровневая). Кстати, в АДО.НЕТ проблем НИКАКИХ не возникает. Он даже с ораклом работает более менее корректно. А вот нативный АДО вызывает проблемы. Мелкие, но противные.
Кстати, вместо того чтобы публиковать многокилобайтные исходники, может просто по русски написать, КАК прервать таки асинхронный запрос ?
Идея с переконнектом, имхо, ОЧЕНЬ плоха.
ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ. Они ПЕРВЫМИ внедряли мс скл, причем под непосредственным руководством спецов из мс.
А уж сертификатов у них - все стены увешены.
← →
sniknik © (2008-03-17 12:20) [63]> 1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
не работал с ораклом, сталкивался, но не работал, но если бы пришлось, первым бы, что попробовал было бы ADO.
а насчет "нормальных", кто сказал что они нормальные? не верю тем кто говорит что ADO "ненормально", это против моего опыта.
> Кстати, вместо того чтобы публиковать многокилобайтные исходники
я не даю/публикую исходников в ветках типа этой, в которой кроме трепа ничего не представлено. (причем инициатор трепа не я)
> может просто по русски написать, КАК прервать таки асинхронный запрос ?
я писал. но все напрочь проигнорировано... мне вот например наоборот очень интересно как можно не сделать такой простой веши. что можно сделать чтобы не работало...
> Идея с переконнектом, имхо, ОЧЕНЬ плоха.
где переконнект? приведен и код и обьяснение, и тем не менее вы делаете вывод "со своей колокольни", неадекватный.
(как мне кажется аналогично и по всему остальному)
> ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ.
а кто на них наезжает? читай тщательнее. если уж к ним сами спецы из мс приходили и сказали "работайте через DBLib!", ктоб смог отказаться?... вынуждены.
или там была ситуация типа описанной? начали с ADO не справились, перекинулись на DBLib... и начали долго долго писать свою обертку... (ну хоть какаято польза, поневоле спецом станешь)
← →
ANB (2008-03-17 12:54) [64]
> если уж к ним сами спецы из мс приходили и сказали "работайте
> через DBLib!", ктоб смог отказаться?...
Основное приложение у них на АДО. Думаете, кому то сильно хотелось изучать DBLib, для написания утилит ?
Основная грабля АДО, как универсального средства - он плохо понимает уровень серьезности ошибки. Т.е. в хранимке произошла ошибка, ошибка кидается в лог, хранимка идет дальше. АДО же считает, что хранимка прервалась и выдает исключение. DBLib же работает аккуратно. Кстати, и GO понимает без предварительной распилки скрипта.
> как можно не сделать такой простой веши
Какой ? Я добился асинхронности, но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных способов (Cancel, Close, Close коннекту, RollBack). Может, конечно, при работе с мс скл ситуация лучше, но с ораклом асинхронка не доделана.
← →
sniknik © (2008-03-17 13:25) [65]> Кстати, и GO понимает без предварительной распилки скрипта.
GO это не команда SQL, это команда "исполнителя скриптов" типа QA и его консольного аналога... она в скрипте не может не давать ошибки. что наводит на мысль, что чтото там у вас не так и с предыдущей ошибкой, может вся "аккуратность" DBLib просто в том, что написали вы с его использованием так, что ошибки попросту игнорирует? (там же надо весь механизм в том числе и с ошибками переписывать)
> но запрос к ораклу НЕ СНИМАЕТСЯ ... но с ораклом асинхронка не доделана.
это можно поверить -> [61], нужно только желание... сделать строку коннекта и выполнить запрос в примере это 2 минуты. (имхо 98,8% за то что работает)
← →
ANB (2008-03-17 13:37) [66]
> GO это не команда SQL, это команда "исполнителя скриптов"
> типа QA и его консольного аналога... она в скрипте не может
> не давать ошибки. что наводит на мысль, что чтото там у
> вас не так и с предыдущей ошибкой, может вся "аккуратность"
> DBLib просто в том, что написали вы с его использованием
> так, что ошибки попросту игнорирует? (там же надо весь механизм
> в том числе и с ошибками переписывать)
Аккуратность заключается в том, что работает со скриптом ОДИН к ОДНОМУ, как QA. А с АДО такого не получается.
Чесно говоря, лениво вытаскивать целый пример, тем более у вас с мс скл он, а у меня оракл. нельзя ли опубликовать только кусочек под кнопкой "отменить запрос" чтобы проверить саму методу ?
← →
Petr V. Abramov © (2008-03-17 13:39) [67]
> ANB (17.03.08 12:54) [64]
.
> но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных
> способов
там не асинхронка не доделана, а вообще прерывание выполнения запроса любым способом. Даже если снимать сессию через alter system kill session, часто можно получить "session marked for kill" и висеть marked она будет вечно
← →
ANB (2008-03-17 14:07) [68]
> там не асинхронка не доделана, а вообще прерывание выполнения
> запроса любым способом
из девелопера, тоада, через ДОА и ОДАК - без проблем все нормально снимается. Я ж корректный случай взял. Да, иногда подвисает и не снимается ничем, даже сессия не убивается. Но не для этого запроса, на котором я экспериментировал.
> висеть marked она будет вечно
- ну не вечно. Обычно часа через 2 отваливается. А уж на следующий день ее по любому обычно уже нету.
← →
Petr V. Abramov © (2008-03-17 14:19) [69]
> ANB (17.03.08 14:07) [68]
> из девелопера, тоада, через ДОА и ОДАК - без проблем все
> нормально снимается.
ну волшебства тут никакого
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci16msc007.htm#sthref3500
как ее там ADO использует - другой вопрос.
> Да, иногда подвисает и не снимается ничем, даже сессия не
> убивается.
так тоже часа через 2 снимется :)
> А уж на следующий день ее по любому обычно уже нету.
было дело и неделю висела, пока не orakill`ом не застрелил.
← →
ANB (2008-03-17 14:55) [70]
> было дело и неделю висела, пока не orakill`ом не застрелил.
Не, у нас админы че то настроили - больше суток сессия не висит.
> так тоже часа через 2 снимется :)
Там - это в АДО ? Ни фига. Мой запрос отрабатывает 2 мин. В девелопере - снимается менее чем через секунду.
Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал же).
← →
Petr V. Abramov © (2008-03-17 15:04) [71]
> ANB (17.03.08 14:55) [70]
> Не, у нас админы че то настроили - больше суток сессия не
> висит.
да нет такого параметра "сколько висеть" :)
тут все на везении.
> Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал
> же).
да такой же это универсал, как BDE, все равно в конце концов на OCI основано, прекрасно трассируется любым OCI-трассировщиком.
Кстати, ради интерса посмотри, что оно пытается делать при Cancel, мне самому интересно стало, а дельфу подымать лень, в VS разбираться с ADO - тем более :)
← →
ANB (2008-03-17 15:22) [72]
> а дельфу подымать лень
У меня отчет уже третий час колбасит - не могу в делфу залезть.
← →
ANB (2008-03-17 17:50) [73]
procedure TDataSet.Cancel;
procedure CancelNestedDataSets;
var
I: Integer;
begin
if Assigned(FNestedDataSets) then
for I := 0 to FNestedDataSets.Count - 1 do
with TDataSet(FNestedDataSets[I]) do
if Active then Cancel;
end;
var
DoScrollEvents: Boolean;
begin
case State of
dsEdit, dsInsert:
begin
CancelNestedDataSets;
DataEvent(deCheckBrowseMode, 0);
DoBeforeCancel;
DoScrollEvents := (State = dsInsert);
if DoScrollEvents then DoBeforeScroll;
UpdateCursorPos;
InternalCancel;
FreeFieldBuffers;
SetState(dsBrowse);
Resync([]);
DoAfterCancel;
if DoScrollEvents then DoAfterScroll;
end;
end;
end;
Думал, что то попутал, но все верно. Cancel набору данных - тупо отмена редактирования/вставки.
Cancel коннекту уходит в вызов метода АДО, но никакого эффекта не дает - запрос висит.
← →
ANB (2008-03-17 17:56) [74]Во. Нашел. Cancel коннекту согласно доке должен помочь. Но не помогает.
← →
Petr V. Abramov © (2008-03-17 18:01) [75]
> ANB (17.03.08 17:56) [74]
OCI-трассировщиком глянь, че он пытается делать
← →
MsGuns © (2008-03-17 21:02) [76]С ураклом не работал, но, думаю, что он тут не при чем - вся закавыка в неправильном (некорректном) использовании ADO.
У меня с мсскл все весело снимается. Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
Для того, чтобы это проверить, достаточно побаловаться с QA - там есть кнопка останова. Он же как-то это делает, а ? Или он не джетом пользуется ?
← →
sniknik © (2008-03-17 22:36) [77]> Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
проверь в тесте [61], не должен ждать. ждешь ты, имхо, потому, что cancel "оберточный" используешь, а там вроде сделано с ожиданием ответа, специально, типа гарантировано. а QA бросает все на "произвол судьбы" не ожидая подтверждений.
> Или он не джетом пользуется ?
естественно не jet-ом, jet это access, а не mssql. но вообще чем бы он там не пользовался, все это можно повторить чисто на ADO (может им и пользуется, хотя он и ODBC*-шную dll подключает... может и его тоже, вперемешку). ну, более менее повторить, трудности наверняка будут, но пока я их не вижу (и они будут не там где могут подумать... а например в отсутствии грида для отображения, т.к. он явно работает с датасетами с серверным курсором, дельфишный такое отображать не может. и т.д. и т.п. неясно пока не столкнешся).
← →
DmitriyG. © (2008-03-18 00:16) [78]Сегодня поздно завтра проверю, отмену на большой базы для MSSQL
← →
Anatoly Podgoretsky © (2008-03-18 04:37) [79]
> Для того, чтобы это проверить, достаточно побаловаться с
> QA - там есть кнопка останова. Он же как-то это делает,
> а ? Или он не джетом пользуется ?
Он пользуется ODBC
← →
DmitriyG. © (2008-03-18 11:11) [80]Посмотрел. Впринципе работает также как и у меня, только у Вас после снятия некоторых запросов выдается
"Cannot perform this operation on a closed dataset"
И проблема не решена: при выборке большого кол-ва записей и отмене запроса данные по сети передаются (30% загрузки)!!!! Причем при повторном выполнении запроса сеть становится занятой на 60%. При отмене из QA все нормально.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
Память: 0.66 MB
Время: 0.048 c