Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];

Вниз

Отмена выполнения запроса   Найти похожие ветки 

 
DmitriyG. ©   (2008-03-11 16:13) [0]

Можно ли для MSSQL 2005 сделать отмену выполнения запроса?
Вопрос мне кажется наболевший, но ответа нигде нет...


 
clickmaker ©   (2008-03-11 16:27) [1]

через что?


 
DmitriyG. ©   (2008-03-11 16:46) [2]

Наверное через ADO...
Вроде бы нашел
 ADOCommand.Execute;
 repeat
   Application.ProcessMessages;
   if IsAbort then
     ADOCommand.Cancel;
 until (stExecuting in ADOCommand.States = False);

Более элегантного я так понимаю не получится найти....


 
Johnmen ©   (2008-03-11 16:49) [3]

Что означает "отменить выполнение запроса"?


 
DmitriyG. ©   (2008-03-11 16:54) [4]

Прервать долго выполняющийся запрос


 
Johnmen ©   (2008-03-11 17:10) [5]

Это вряд ли получится.
Но попробуй асинхронно из другого потока. Не сможешь попробовать - забей. Лучше запросы пиши быстрые :))


 
DmitriyG. ©   (2008-03-11 17:16) [6]

Ага... А если база на терабайт? И ищем внтури xml например?
Я думаю ускроить вряд ли получиться, а вот отменить часто хочется... :-)


 
sniknik ©   (2008-03-11 17:24) [7]

> Вроде бы нашел
при синхронном выполнении ADOCommand.Execute; "отдаст" управление только после завершения выполнения запроса и получении рекордсета (при клиентском курсоре)
смысл дальнейшего кода нулевой...

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

> Более элегантного я так понимаю не получится найти....
а ты не ищи, ты изучай, и пиши по надобности то, что именно тебе необходимо.


 
sniknik ©   (2008-03-11 17:28) [8]

> Я думаю ускроить вряд ли получиться
зачем данные в которых делается поиск хранятся в виде не предназначеном для него?

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


 
ANB   (2008-03-11 18:04) [9]


> DmitriyG. ©   (11.03.08 16:46) [2]

1) Добавить в цикл Sleep
2) На время ожидания поднять формочку, в которой крутить мультики, с кнопкой отмена
3) Способа лучше нету. Тока убедись, что запрос выполняется асинхронно.

ЗЫ. Скептикам : у нас в фин.отчетности большая часть запросов выполняется часы. Ускорено уже по максимум (ранее выполнялось несколько суток).


 
sniknik ©   (2008-03-11 19:46) [10]

> 1) Добавить в цикл Sleep
зачем? там же есть Application.ProcessMessages;

> 2) На время ожидания поднять формочку, в которой крутить мультики, с кнопкой отмена
тогда и смысл Application.ProcessMessages; пропадает, не говоря о Sleep ... он (цикл выборки) же уже там есть, если ShowModal...
бред какойто в общем советуешь...

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

> Ускорено уже по максимум
уверен? а то судя по тому, что советуешь ...

> (ранее выполнялось несколько суток).
ну, это уж вообще не доказательство...


 
Ega23 ©   (2008-03-12 00:11) [11]


> включи полнотекстовый поиск (текст индексируется по словам
> из которых состоит) и ищи... быстро.


Кстати, о пцыцах.
А вот кок долго он будет строиться? (FTI)
Это нормально, что он у меня на 5.000.000 записей по прикидкам 2 суток будет строиться???


 
Johnmen ©   (2008-03-12 00:18) [12]


> Ega23 ©   (12.03.08 00:11) [11]
> А вот кок долго он будет строиться? (FTI)

Из практики - на P3 самом быстром на ~100 т.з. ~1 час.


 
Германн ©   (2008-03-12 02:31) [13]


> Ega23 ©   (12.03.08 00:11) [11]

Оффтоп по поводу русского языка. Но это нынче в моде.
Я бы написал "о пцицах". Или "о псИсах" :)


 
Ega23 ©   (2008-03-12 07:50) [14]


> Я бы написал "о пцицах". Или "о псИсах" :)


Откровенно говоря, не помню откуда это взялось.
Есть подозрение, что из грузинской рок-оперы "Муха Цокотуха". Очень интересное произведение было...  :)


 
ANB   (2008-03-12 09:40) [15]


> зачем? там же есть Application.ProcessMessages;

Мало. Процессор все равно лопается. Sleep(200) или 100 - в самую тему там.


> ShowModal...

- единственный способ показать форму ? Кистате, я обычно просто кнопку "стоп" включаю на тулбаре - не нравятся мне модальные формы по делу и без.


> > Ускорено уже по максимум
> уверен? а то судя по тому, что советуешь ...


5 таблиц. в 1-й 20 000 000 записей. В остальных - примерно в 100 раз больше (истории всякие). Все сджойнить и сгруппировать.
Быстрее чем за полтора часа у меня не получилось. Если Вы сможете оптимизнуть круче - приходите к нам работать. Зарплатой мой начальник не обидит.


 
sniknik ©   (2008-03-12 10:43) [16]

>> ShowModal...
> - единственный способ показать форму ?
не единственный, а разумный (!)... делать показ по другому (по вашему) только затем чтобы после делать "костыль" из цикла с ProcessMessages вместо стандартной выборки сообщений, делающий тоже самое только хуже, глупо.

> не нравятся мне модальные формы по делу и без.
ты советовал показать форму на время выполнения запроса, какая разница нравиться тебе ее показывать модально или нет если показать так проще (писать меньше) и лучше ("костылей" нет)?
(мне например вон with не нравиться... но если я считаю что код с ним будет лучше (уберет например лишнюю переменную), я его все одно использую. невзирая на личные предпочтения)

> 5 таблиц. в 1-й 20 000 000 записей.
ну, таких у меня рабочих нет, хотя пробовать пробовал.
даже расказывал тут както (можеш найти в дайджестах) про столкновение с ораклом, когда клиент на вопрос, а че так долго (2 часа) на хваленом "самом быстром"? сказал "так 40 миллионов записей в таблице"... типа это чтото доказывает. дома сделал тест с той же структурой, нагенерил теже 40 миллионов случайных значений и написал запрос на тот же результат (не оптимизировал, а написал с 0, т.к. сами ихние запросы мне никто не да (сам ради интереса проверял), результат у меня получился за секунды... чего они там оптимизировали и как ради 2х часов х.з. правда я поставил это в заслугу MSSQL-ю т.к. тестил на нем, а "оригинал" был на оракле.

> Все сджойнить и сгруппировать.
цель разве в этом? а если возможен тот же результат вообще без джойнов, или групп... засчитается? ;)

> Если Вы сможете оптимизнуть круче - приходите к нам работать.
вот чего я точно не могу, так это "лечить" по фотографии. (а данных приведено даже меньше чем на фотографии с пациента)
дай мне модель базы (части для которой запрос), и что делать (о чем запрос), и посмотрю, возможно оптимизировать или нет.


 
DmitriyG. ©   (2008-03-12 11:11) [17]

Кстати приведенный в начале пример не рабочий - States сразу после выполения запроса = stClose... Так что пока ищу варианты...
А по поводу оптимизации данных и выборки всего нескольких записей скажу: - есть ситуации когда необходимо бывает стянуть на клиента тысяч 50 записей или например произвезсти поиск содержимому BLOB поля (в этом случае случае я думаю вряд ли можно как нибудь оптимизировать запрос)


 
Ega23 ©   (2008-03-12 11:17) [18]


> произвезсти поиск содержимому BLOB поля


Full-text Search?


 
sniknik ©   (2008-03-12 11:26) [19]

> есть ситуации когда необходимо бывает стянуть на клиента тысяч 50 записей
просто "стянуть" это даже секунду не займет, не то что время чтобы требовалась какаято особая обработка, типа формы на время выполнения... часиков в курсоре хватит.
(при приемлемом количестве полей в запросе разумеется, а то если "ширина" записи больше чем "высота" таблицы, тады ой...)

> в этом случае случае я думаю вряд ли можно как нибудь оптимизировать запрос
в этом случае нужно "оптимизировать" логику построения базы и работы с ней. ибо нефиг "поисковые" данные вкладывать внутрь BLOB полей.

> Full-text Search?
а если картинка, и поиск идет всех черных "пикселей"/группы... ? (в MSSQL блоб имеет название (тип) image, а текст так и есть text ...)


 
sniknik ©   (2008-03-12 11:28) [20]

> Кстати приведенный в начале пример не рабочий - States сразу после выполения запроса = stClose...
тебе что зря про асинхронные запросы говорили?... естественно он у тебя stClose при ...  -> [7] первый абзац.


 
Johnmen ©   (2008-03-12 11:33) [21]


> DmitriyG. ©   (12.03.08 11:11) [17]
> есть ситуации когда необходимо бывает стянуть
> на клиента тысяч 50 записей

Можно поподробней, что за ситуации, когда надо сразу столько записей?


 
Ega23 ©   (2008-03-12 11:36) [22]


> Можно поподробней, что за ситуации, когда надо сразу столько
> записей?


Есть, у меня аккурат сейчас такая.
Правда там, фактически, ID с небольшим заголовком тянется. А вот вся дополнительная инфа - уже через Master-detail и по одной записи...  :)


 
ANB   (2008-03-12 11:49) [23]


> цель разве в этом? а если возможен тот же результат вообще
> без джойнов, или групп... засчитается? ;)

Значится надо пройти по 20 миллионам договоров, по истории (около 100 миллионов записей) определить группу риска на дату, по остаткам в разрезе договоров (около 2-х миллиардов записей) вытащить на дату остатки разных 4-х типов, по таблице коммиссий в разрезе договоров (чуть больше миллиарда записей) вытащить остатки по 6 типам коммиссий на дату, выкинуть проданные и закрытые на дату договора (отсеется около 10%) тоже по таблицам с историей(2 таблицы, около 5 миллионов записей в каждой), по таблице продаж договоров (около 40 миллионов записей) уточнить тип договора. На основании выгребленных данных раскидать остатки и комиссии по отдельным полям, все сложить, сгруппировав по вычисленным типам договоров.
Т.е. на выходе примерно 5 записей.
Менять  структуру и заводить индексы низзя. Можно пользоваться времянками.


 
ANB   (2008-03-12 11:54) [24]


> не единственный, а разумный (!)... делать показ по другому
> (по вашему) только затем чтобы после делать "костыль" из
> цикла с ProcessMessages вместо стандартной выборки сообщений,
>  делающий тоже самое только хуже, глупо.

В принципе - вариант.
Только модальная форма же внутри себя сообщения обрабатывает - как тогда проверять, что запрос уже выполнился и уже мона форму закрыть ? Или придется писать свой цикл обработки сообщений.
Можно, конечно, в отдельном потоке запрос выполнять, но неудобно и граблей много.

Может поподробнее разжуешь - как с модальной формой это аккуратно сделать ?


 
sniknik ©   (2008-03-12 12:00) [25]

> Менять  структуру и заводить индексы низзя.
?, а дышать во время программирования можно?

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


 
ANB   (2008-03-12 12:08) [26]


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

1. Индексы почти все нужные есть. Для выборки менее миллиона договоров (если запрошен конкретный тип, договоров с которым немного) я по ним запрос и сделал - за 20 секунд все считает (хотя все равно надо формочку показывать)
Нельзя тока новые индексы добавлять.
2. Фулл-скан фулл-скану - рознь. Правда, виртуозной оптимизацией мой начальник занимается. В частности, была аналогичная задача. План был на индексах. Считался больше суток да еще и RBS кончался через раз. После перевода на фулл-скан стал считаться 2 часа. Я не очень опытен в такой оптимизации, посему из того кода постоянно приемы и деру нагло.


 
sniknik ©   (2008-03-12 12:09) [27]

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

> Можно, конечно, в отдельном потоке запрос выполнять
"асинхронность" сама свой поток сделает, не стоит парится.

> но неудобно и граблей много.
Form.ShowModal; в одном месте и Form.Close; в другом это слишком много граблей?... нда, а ваша структура базы без индексов это что?


 
sniknik ©   (2008-03-12 12:12) [28]

> 1. Индексы почти все нужные есть.
по дате нету, если вам для "определить группу риска на дату" приходится "20 миллионам договоров" сканировать. или они все на один день? ("на дату") ???


 
ANB   (2008-03-12 12:20) [29]


> событие при завершении есть, я говорил.

Все. Понял. В бефоре - поднять форму, в афтер - закрыть.
Чет в одаке у меня эти события не всегда корректно ловились, посему я и ставил циклы ожидания.
Впрочем, обычно мне приходилась выполнять не запросы, а просто долго работующую хранимку/блок.
Действительно, вариант самый удобный, а мультик мона готовый на форму ожидания кинуть.
Единственно - нарывался на странный эффект, когда модальная форма уходила на задний план и приложение клинило. Причем даже в тодае такой эффект иногда вылезает.


> по дате нету, если вам для "определить группу риска на дату"
> приходится "20 миллионам договоров" сканировать. или они
> все на один день? ("на дату") ???

20 миллионов - это действующие договора. Для каждого из которых надо рассчитать несколько параметров. А потом уже эти параметры сложить.
Индекс по дате в историях есть - я же написал, есть запрос по индексам, но на количестве договоров более 2 миллионов его клинит.


 
sniknik ©   (2008-03-12 12:25) [30]

> когда модальная форма уходила на задний план и приложение клинило.
родитель у формы nil был.

> 20 миллионов - это действующие договора. ...
не. "лечение по фотографии" надо прекращать, вот с чего "его клинит" на 2х миллионах? у меня в тесте на 40ка не клинило а вас на 2х... не понимаю.


 
ANB   (2008-03-12 12:46) [31]


> родитель у формы nil был.

Не, нормально все прописывал - все равно, если переключаться между окнами, иногда пропадает. Особливо ShowMessage этим грешит.


> у меня в тесте на 40ка не клинило а вас на 2х... не понимаю.

А сколько таблиц и какого размера к этим 40-ка прикручивал ?

Я, до прихода на это место, тоже завсегда сводил оптимизацию к определить оптимальный порядок обхода таблиц,проверить наличие/создать нужные индексы, прохинтовать чтобы план строился как мне надо.

Ща приходится учится работать с большими объемами, для которых такие вещи не всегда прокатывают.

Короче - если сможешь на оракле еще ускорить такой запрос и аналогичные - начальник возьмет на работу с окладом не меньше моего (а то и больше). Сейчас у нас 2 человека сидят на оптимизации, один из которых - начальник и есть.


 
ANB   (2008-03-12 12:49) [32]


> вот с чего "его клинит" на 2х миллионах?

Не то чтобы совсем клинит, но фулл-скан стабильно где то за час все перелопачивает, причем количество договоров уже сильно не влияет на время. А по индексу - больше 2-х часов я ждать уже замучался. Да и юзеры жалуются, что падает с ошибкой (под RBS места не сильно много и увеличивать его значительно уже особо некуда).


 
DmitriyG. ©   (2008-03-13 11:07) [33]

Я конечно извиняюся за назойлисвость, но получается рабочего варианта отмены запросы пока никто не предложил. Дискусии на фига это нужно и что нужно оптимизировать и тому подобное конечно хорошо... Но бывают ситуации, что нужно прервать запрос, который будет выполняться даже заведомо 5 минут...


 
Sergey13 ©   (2008-03-13 12:00) [34]

> [33] DmitriyG. ©   (13.03.08 11:07)

В оракловом инструменте PL/SQL Delveloper это, насколько я понял, реализовано примерно так. Каждый запрос выполняется в отдельной сессии. При зависании запроса срубается сессия.


 
sniknik ©   (2008-03-13 12:17) [35]

> Каждый запрос выполняется в отдельной сессии.
им наверное приходится "выкручиваться" потому, что используемые ими компоненты/методы не поддерживают потоков/сессий/асинхронности самостоятельно. для ADO у которого есть асинхронный режим это лишнее.

> но получается рабочего варианта отмены запросы пока никто не предложил.
ты просто не понял предложенного, как не понял и найденного кода ([2]) который вполне рабочий, при определенных обстоятельствах.
...
можно и проще. вот код который отменяет запрос (прямой и точный ответ на заданный вопрос)
ADODataSet1.Close;
помогло? без понимания то.
(на самом деле просто прерывается работа клиентского потока, сервер его все одно "докрутит", но это практически у всех так)


 
ANB   (2008-03-13 13:04) [36]


> При зависании запроса срубается сессия.

Нет. Более того, сессию замучаешься срубать, если она чего то делает.
Девелопер открывает отдельную сессию для каждого окошка (если включена соответствующая настройка). За счет этого мона одновременно выполнять несколько запросов параллельно в разных окнах.
Есть специальная команда в OCI - "срубить запрос".


 
ANB   (2008-03-13 13:07) [37]


> сервер его все одно "докрутит", но это практически у всех
> так

в оракле не так. хотя можно умудрится проигнорить срубание. особенно, если выполняется хранимка.
Кстати, в мс скл, если лезть через DBLib, тоже аккуратно все срубается. Пример - QA.


 
Правильный_Вася   (2008-03-13 13:10) [38]

не знаю, будет жить или нет, но в качестве идеи

написать функцию, которая будет опрашивать некую сессионную переменную в БД (если такие есть в скуле)
при необходимости отмены запроса она выставляется из программы в нужное значение
функция встраивается в where запроса, ей передается параметром некое поле из таблицы (чтоб оптимизатор не подумал, что значение функции можно посчитать один раз и успокоиться), а сама функция возвращает нечто, что явно не дает выполниться остальной части запроса (напримар, false для условия and во where)


 
Sergey13 ©   (2008-03-13 13:29) [39]

> [36] ANB   (13.03.08 13:04)

Тогда почему кнопочка убийства запроса доступна только при многосессионной настройке?


 
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.73 MB
Время: 0.046 c
2-1217490630
Sergey2
2008-07-31 11:50
2008.09.14
проблема с Вистой


2-1217529981
Noobik
2008-07-31 22:46
2008.09.14
Вопрос по скрипиту на delphi


3-1205910143
scorpio_md
2008-03-19 10:02
2008.09.14
Объединение 2 таблиц


15-1216634664
TUser
2008-07-21 14:04
2008.09.14
Сколько ватт БП и дополнительных вентилияторов


15-1216883567
ееееееекенитен
2008-07-24 11:12
2008.09.14
можно ли подключить к ноуту 2 одновоременно работающих WiFi-устр?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский