![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отмена выполнения запроса
DmitriyG. © (2008-03-11 16:13:00)Можно ли для MSSQL 2005 сделать отмену выполнения запроса?
Вопрос мне кажется наболевший, но ответа нигде нет...
DmitriyG. (2008-03-18 11:11:00) [1]Посмотрел. Впринципе работает также как и у меня, только у Вас после снятия некоторых запросов выдается
"Cannot perform this operation on a closed dataset"
И проблема не решена: при выборке большого кол-ва записей и отмене запроса данные по сети передаются (30% загрузки)!!!! Причем при повторном выполнении запроса сеть становится занятой на 60%. При отмене из QA все нормально.
Anatoly Podgoretsky (2008-03-18 04:37:00) [2]
> Для того, чтобы это проверить, достаточно побаловаться с
> QA - там есть кнопка останова. Он же как-то это делает,
> а ? Или он не джетом пользуется ?
Он пользуется ODBC
DmitriyG. (2008-03-18 00:16:00) [3]Сегодня поздно завтра проверю, отмену на большой базы для MSSQL
sniknik (2008-03-17 22:36:00) [4]> Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
проверь в тесте [61], не должен ждать. ждешь ты, имхо, потому, что cancel "оберточный" используешь, а там вроде сделано с ожиданием ответа, специально, типа гарантировано. а QA бросает все на "произвол судьбы" не ожидая подтверждений.
> Или он не джетом пользуется ?
естественно не jet-ом, jet это access, а не mssql. но вообще чем бы он там не пользовался, все это можно повторить чисто на ADO (может им и пользуется, хотя он и ODBC*-шную dll подключает... может и его тоже, вперемешку). ну, более менее повторить, трудности наверняка будут, но пока я их не вижу (и они будут не там где могут подумать... а например в отсутствии грида для отображения, т.к. он явно работает с датасетами с серверным курсором, дельфишный такое отображать не может. и т.д. и т.п. неясно пока не столкнешся).
MsGuns (2008-03-17 21:02:00) [5]С ураклом не работал, но, думаю, что он тут не при чем - вся закавыка в неправильном (некорректном) использовании ADO.
У меня с мсскл все весело снимается. Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
Для того, чтобы это проверить, достаточно побаловаться с QA - там есть кнопка останова. Он же как-то это делает, а ? Или он не джетом пользуется ?
Petr V. Abramov (2008-03-17 18:01:00) [6]
> ANB (17.03.08 17:56) [74]
OCI-трассировщиком глянь, че он пытается делать
ANB (2008-03-17 17:56:00) [7]Во. Нашел. Cancel коннекту согласно доке должен помочь. Но не помогает.
ANB (2008-03-17 17:50:00) [8]
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 15:22:00) [9]
> а дельфу подымать лень
У меня отчет уже третий час колбасит - не могу в делфу залезть.
Petr V. Abramov (2008-03-17 15:04:00) [10]
> ANB (17.03.08 14:55) [70]
> Не, у нас админы че то настроили - больше суток сессия не
> висит.
да нет такого параметра "сколько висеть" :)
тут все на везении.
> Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал
> же).
да такой же это универсал, как BDE, все равно в конце концов на OCI основано, прекрасно трассируется любым OCI-трассировщиком.
Кстати, ради интерса посмотри, что оно пытается делать при Cancel, мне самому интересно стало, а дельфу подымать лень, в VS разбираться с ADO - тем более :)
ANB (2008-03-17 14:55:00) [11]
> было дело и неделю висела, пока не orakill`ом не застрелил.
Не, у нас админы че то настроили - больше суток сессия не висит.
> так тоже часа через 2 снимется :)
Там - это в АДО ? Ни фига. Мой запрос отрабатывает 2 мин. В девелопере - снимается менее чем через секунду.
Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал же).
Petr V. Abramov (2008-03-17 14:19:00) [12]
> 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:07:00) [13]
> там не асинхронка не доделана, а вообще прерывание выполнения
> запроса любым способом
из девелопера, тоада, через ДОА и ОДАК - без проблем все нормально снимается. Я ж корректный случай взял. Да, иногда подвисает и не снимается ничем, даже сессия не убивается. Но не для этого запроса, на котором я экспериментировал.
> висеть marked она будет вечно
- ну не вечно. Обычно часа через 2 отваливается. А уж на следующий день ее по любому обычно уже нету.
Petr V. Abramov (2008-03-17 13:39:00) [14]
> ANB (17.03.08 12:54) [64]
.
> но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных
> способов
там не асинхронка не доделана, а вообще прерывание выполнения запроса любым способом. Даже если снимать сессию через alter system kill session, часто можно получить 'session marked for kill' и висеть marked она будет вечно
ANB (2008-03-17 13:37:00) [15]
> GO это не команда SQL, это команда "исполнителя скриптов"
> типа QA и его консольного аналога... она в скрипте не может
> не давать ошибки. что наводит на мысль, что чтото там у
> вас не так и с предыдущей ошибкой, может вся "аккуратность"
> DBLib просто в том, что написали вы с его использованием
> так, что ошибки попросту игнорирует? (там же надо весь механизм
> в том числе и с ошибками переписывать)
Аккуратность заключается в том, что работает со скриптом ОДИН к ОДНОМУ, как QA. А с АДО такого не получается.
Чесно говоря, лениво вытаскивать целый пример, тем более у вас с мс скл он, а у меня оракл. нельзя ли опубликовать только кусочек под кнопкой "отменить запрос" чтобы проверить саму методу ?
sniknik (2008-03-17 13:25:00) [16]> Кстати, и GO понимает без предварительной распилки скрипта.
GO это не команда SQL, это команда "исполнителя скриптов" типа QA и его консольного аналога... она в скрипте не может не давать ошибки. что наводит на мысль, что чтото там у вас не так и с предыдущей ошибкой, может вся "аккуратность" DBLib просто в том, что написали вы с его использованием так, что ошибки попросту игнорирует? (там же надо весь механизм в том числе и с ошибками переписывать)
> но запрос к ораклу НЕ СНИМАЕТСЯ ... но с ораклом асинхронка не доделана.
это можно поверить -> [61], нужно только желание... сделать строку коннекта и выполнить запрос в примере это 2 минуты. (имхо 98,8% за то что работает)
ANB (2008-03-17 12:54:00) [17]
> если уж к ним сами спецы из мс приходили и сказали "работайте
> через DBLib!", ктоб смог отказаться?...
Основное приложение у них на АДО. Думаете, кому то сильно хотелось изучать DBLib, для написания утилит ?
Основная грабля АДО, как универсального средства - он плохо понимает уровень серьезности ошибки. Т.е. в хранимке произошла ошибка, ошибка кидается в лог, хранимка идет дальше. АДО же считает, что хранимка прервалась и выдает исключение. DBLib же работает аккуратно. Кстати, и GO понимает без предварительной распилки скрипта.
> как можно не сделать такой простой веши
Какой ? Я добился асинхронности, но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных способов (Cancel, Close, Close коннекту, RollBack). Может, конечно, при работе с мс скл ситуация лучше, но с ораклом асинхронка не доделана.
sniknik (2008-03-17 12:20:00) [18]> 1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
не работал с ораклом, сталкивался, но не работал, но если бы пришлось, первым бы, что попробовал было бы ADO.
а насчет "нормальных", кто сказал что они нормальные? не верю тем кто говорит что ADO "ненормально", это против моего опыта.
> Кстати, вместо того чтобы публиковать многокилобайтные исходники
я не даю/публикую исходников в ветках типа этой, в которой кроме трепа ничего не представлено. (причем инициатор трепа не я)
> может просто по русски написать, КАК прервать таки асинхронный запрос ?
я писал. но все напрочь проигнорировано... мне вот например наоборот очень интересно как можно не сделать такой простой веши. что можно сделать чтобы не работало...
> Идея с переконнектом, имхо, ОЧЕНЬ плоха.
где переконнект? приведен и код и обьяснение, и тем не менее вы делаете вывод "со своей колокольни", неадекватный.
(как мне кажется аналогично и по всему остальному)
> ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ.
а кто на них наезжает? читай тщательнее. если уж к ним сами спецы из мс приходили и сказали "работайте через DBLib!", ктоб смог отказаться?... вынуждены.
или там была ситуация типа описанной? начали с ADO не справились, перекинулись на DBLib... и начали долго долго писать свою обертку... (ну хоть какаято польза, поневоле спецом станешь)
ANB (2008-03-17 11:50:00) [19]
> пока что, все "зубры" что мне встречались, те что "уходят"
> от ADO ищя "волшебных" возможностей в других технологиях,
> все попросту "не разобрались с управлением".
1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
2. Немного тяжелее с мс скл. Другой технологии, кроме АДО, мс и не предоставляет (DBLib - слишком низкоуровневая). Кстати, в АДО.НЕТ проблем НИКАКИХ не возникает. Он даже с ораклом работает более менее корректно. А вот нативный АДО вызывает проблемы. Мелкие, но противные.
Кстати, вместо того чтобы публиковать многокилобайтные исходники, может просто по русски написать, КАК прервать таки асинхронный запрос ?
Идея с переконнектом, имхо, ОЧЕНЬ плоха.
ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ. Они ПЕРВЫМИ внедряли мс скл, причем под непосредственным руководством спецов из мс.
А уж сертификатов у них - все стены увешены.
sniknik (2008-03-17 11:08:00) [20]сорри, в прошлом примере глюк, не учел что прогресс в другом потоке, а я там "красоту навел" счетчик фетча обновляю и кнопки интерфейса дизейблю (т.е. фактически к VCL из потока пусть и неявного обращаюсь)... AV может быть.
замена
http://webfile.ru/1808019