Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Внизпроблемы с ADOQuery+SQL Найти похожие ветки
← →
Stepa (2003-11-19 20:21) [0]Постараюсь объяснить поподробнее, но сам, к сожалению, в Delphi не силен....необходимо найти ошибку, и сообщить разработчику приложения....
Приложение использует один ADOConnection для подключения к MSSQL.
в определенный момент, создаются 10-15 ADOQuery (каждый в собственном Thread), подключающихся через этот Connection. Через каждый из них открывается серверный курсор на одну и ту же таблицу в 70000 записей и начинает фечится. В этот момент происходит "зависание" самого приложения, и жуткое торможение SQL.
Запрос курсора выглядит как SELECT [Field1], [Field2]......[FieldN] FROM Table1 WHERE [FieldN] = X ORDER BY [FieldX]
т.е ничего сверхестественного.
SQL показывает множественные страничные блокировки в TempDB от приложения. И множество дополнительных Connection, которые, как я понимаю, крейтятся самим ADO, в случае, если основной Connection занят фечем из курсора. Просмотр запросов в профайлере не показывает никакого криминала.....только сам запрос и хранимые процедуры SQL по созданию курсора....
На таблице меньшего размера или с меньшим колличеством Query все проходит на ура.
Самое странное, что загрузка компа, на котором крутится и приложение и SQL сервер, после "зависания" - 1-5%
Попросил приятеля сваять то же самое на С++......все работает великолепно...:(
Единственное предположение, что ошибка где-то в реализации компонентов ADO в Delphi.
Прошу прощения, если дал недостаточно данных......спрашивайте, сообщу все необходимое....
Буду очень благодарен за всю возможную помощь.
P.S. Проблемы с железом исключены (заменяли сервак), SQL профиксен до упора, Пробовал и на SQL2000 и на SQL 7.
← →
ZrenBy (2003-11-19 21:23) [1]>>Попросил приятеля сваять то же самое на С++......все работает
>>великолепно...:(
>>Единственное предположение, что ошибка где-то в реализации
>>компонентов ADO в Delphi.
Вполне возможно.
Из-за безобразной работы TADO компонентов
мне пришлось писать свои оболочки над интерфейсами ADO
и работать под ними
← →
Fay (2003-11-20 11:06) [2]Скажите, как Вам удаётся работать с одним Connection-ом из нескольких потоков? Трудно поверить.
← →
АлексейК (2003-11-20 12:33) [3]Попросил приятеля сваять то же самое на С++......все работает великолепно...:(
Единственное предположение, что ошибка где-то в реализации компонентов ADO в Delphi.
Скорее ошибку надо искать у разработчиков приложения, а не у Borlanda или Microsofta. А вот приятель похоже грамотно все сделал.
И множество дополнительных Connection, которые, как я понимаю, крейтятся самим ADO, в случае, если основной Connection занят фечем из курсора
Похоже что коннекты и содают эти самые 10-15 Query, минуя компонент Connection.
SQL показывает множественные страничные блокировки в TempDB от приложения
Если курсор, например, определен как INSENSITIVE, то результирующий набор курсора будет размещатся а TempDb.
Отсюда и блокировки.
Самое странное, что загрузка компа, на котором крутится и приложение и SQL сервер, после "зависания" - 1-5%
Все верно, процессор то не загружен, а находится в постоянном ожидании конца блокировки. Посмотрите еще наличие мертвых блокировок.
Вообщето, интересно, зачем понадобилось, 15 раз из одной таблицы одновременно курсорами извлекать данные.
← →
sniknik (2003-11-20 13:18) [4]Stepa © (19.11.03 20:21)
нужно в каждом потоке свой коннект. + CoInitialize и все связаное.
и еще разграничить что у вас дольше выполнение запроса или получение данных на локаль.
в любом случае поэксперементировать с асинхронным выполнением команд в самом ADO (eoAsyncExecute,eoAsyncFetch...)
скорее всего потоки совсем не понадобятся (их возьмет на себя ADO).
> Попросил приятеля сваять то же самое на С++......все работает великолепно...:(
ваш приятель просто как програмист посильнее (в этой области, ADO), либо случайно(вы в это верите?) использовал более правильный метод.
лирическое отступление
почемуто никогда не слышал уничижительных слов типа "сваять" по отношению к своей или чужой работе от серьезных программистов.
скажите а ваш приятель их употребляет?
← →
АлексейК (2003-11-20 13:28) [5]Еще интересно, код команды, какую Query выполняют конкретно. И что они в асинхронном режиме работают?
← →
sniknik (2003-11-20 13:31) [6]АлексейК (20.11.03 13:28) [5]
> И что они в асинхронном режиме работают?
ADOQuery если в опциях поставить то да.
← →
АлексейК (2003-11-21 07:06) [7]>sniknik ©
Пожалуй неточно выразился, имел ввиду, какое значение имеет ExecuteOptions у этих Query.
← →
sniknik (2003-11-21 08:15) [8]писал уже
eoAsyncExecute,eoAsyncFetch
в зависимости от нужд (и там еще 2 опции вариации этих).
там все довольно просто, нужно только попробовать. и пробовать на обьемных таблицах/запросах иначе разницы нет.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c