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

Вниз

CommandTime Out   Найти похожие ветки 

 
Анонимщики   (2008-05-22 15:07) [0]

Delphi2007, MS SQL 2005; SQL Native Client; ADO

Не работает CommandTimeout при выполнении хранимой процедуры (
ADOStoredProc1.ExecProc
) в случае, если эта процедура имеет вид вроде:

while (1=1)
 begin
   set @a = 0;
  end

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


 
Reindeer Moss Eater ©   (2008-05-22 15:19) [1]

очевидно причина примерно такого же плана как и в следующем случае :

BBreak := False;

repeat
until BBreak;

btn1.onclick(sender...);
begin
BBreak := true;
end;

Если же идет долгий селект, то очевидно при фетче сервер отвлекается на обработку таймаутов.


 
Анонимщики ©   (2008-05-22 15:24) [2]

Меня причина интересует только для того, чтобы проблему можно было обойти.
К тому же, видимо, ответ угадан неверно (могу привести косвенные аргументы).
Кроме того, у меня была надежда, что таймаут контролируется на клиенте, а не на сервере, поскольку в хелпе написано, в частности, следующее:
Use the CommandTimeout property ... to allow the cancellation of an Execute method call, due to delays from network traffic or heavy server use.
А проблема проявляется не только и не столько при выполнении подобного рода ХП, а при большой загрузке сервера.
И последнее, не понял, какое отношение ко всему этому имеет фетч.


 
Reindeer Moss Eater ©   (2008-05-22 15:27) [3]

фетч записей и код твоей мудрой процедуры выполняются в разных контекстах. Один в контексте sql другой в tsql.


 
Анонимщики ©   (2008-05-22 15:31) [4]

Реакции на таймаут нет, даже если запрос работает очень долго, а результирующий набор записей содержит их совсем мало.
Но я не понял, можно ли как-нибудь поправить ситуацию?


 
sniknik ©   (2008-05-22 15:33) [5]

тебе нужен аналог Application.ProcessMessages из дельфи... дать "подышать" и sql серверу, в своем бесконечном цикле.
(а то кто таймаут то обрабатывать будет?)

попробуй простенький селект туда вставить... да хотя бы так SELECT @a = 0 вместо set @a = 0; (не зря же рекомендуют новые методы вместо старых, может в них есть вызов ихнего "ProcessMessages")


 
Reindeer Moss Eater ©   (2008-05-22 15:34) [6]

из исходных данных известно, что при селектах таймаут работает, а при кручении циклов нет.
даже если таймаутами занимается клиент, я не думаю, что адо с клиента "видит" что там делается в sp и понимает разницу между двумя этими случаями и поэтому ведет себя по разному.
Вывод:
сервер тоже участвует в этом процессе.
в чем разница этих случаев с точки зрения сервера?
в разных контекстах.

логика.


 
Анонимщики ©   (2008-05-22 15:37) [7]

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

 while (1=1)
 begin
   select @abcd = IDFile from lst_Files where FileSize = 336;
 end;

Так что предложение "подышать" не проходит.


 
Reindeer Moss Eater ©   (2008-05-22 15:37) [8]

Реакции на таймаут нет, даже если запрос работает очень долго, а результирующий набор записей содержит их совсем мало.
Но я не понял, можно ли как-нибудь поправить ситуацию?


Ты определись сначала, то он у тебя действует только на запросах, то вдруг и на запросах не действует.


 
Анонимщики ©   (2008-05-22 15:42) [9]

Неважно, кто что думает, тут знать нужно.
Кроме того, отменить выполнение можно следующим образом.

1. В ExecuteOptions для TADOStoredProc устанавливаем eoAsyncExecute в True.

Для выполнения ХП делаем следующее:

type
       THackAdoDataSet = class(TCustomADODataSet);
var
 fullTime: Integer;
begin
fullTime := 0;
repeat
  Sleep(1000);
  fullTime := fullTime + 1;
  if  _Command(THackAdoDataSet(ADOStoredProc1).Command.CommandObject).State = 0 then
    break;
until fullTime > ADOStoredProc1.CommandTimeout;
_Command(THackAdoDataSet(ADOStoredProc1).Command.CommandObject).Cancel;

end;


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


 
Анонимщики ©   (2008-05-22 15:47) [10]

--Reindeer Moss Eater ©   (22.05.08 15:37) [8]

--Реакции на таймаут нет, даже если запрос работает очень долго, а --результирующий набор записей содержит их совсем мало.
--Но я не понял, можно ли как-нибудь поправить ситуацию?

--Ты определись сначала, то он у тебя действует только на запросах, то вдруг и --на запросах не действует.

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


 
Reindeer Moss Eater ©   (2008-05-22 15:51) [11]

Кроме того, отменить выполнение можно следующим образом.

тогда в чем проблема.
отменяй.


 
Анонимщики ©   (2008-05-22 15:54) [12]

Нет, все должно работать и в синхронной ситуации. Меня такое решение устроит только в крайнем случае. И все уже давно написано, вносить лишние глюки неохота.


 
Reindeer Moss Eater ©   (2008-05-22 15:55) [13]

ну тогда помедитируй над [1]


 
Анонимщики ©   (2008-05-22 15:59) [14]

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


 
Reindeer Moss Eater ©   (2008-05-22 16:01) [15]

а я бы все же посоветовал помедитрировать над тем циклом


 
Анонимщики ©   (2008-05-22 16:30) [16]

Хорошо, спасибо.


 
Anatoly Podgoretsky ©   (2008-05-22 16:34) [17]

> Анонимщики ©   (22.05.08 15:42) [9]

Странный какой то код, ассинхронный запрос превращаем в синхронный, почему бы просто не использовать синхронный? Зачем же разогревать процессор?


 
Анонимщики ©   (2008-05-22 16:46) [18]

Не совсем понял, вам Sleep"ы не нравятся? Или я неправильно понял?


 
sniknik ©   (2008-05-22 16:48) [19]

> помедитрировать над тем циклом
кстати да,
ADOCommand1.CommandText:= "WAITFOR DELAY ""000:00:10""";
ADOCommand1.CommandTimeout:= 3;
ADOCommand1.Execute;
вываливается по таймауту через 3 сек, а не завершается через 10. (и вставленная в твой цикл задержка в 1 сек например, тоже его разблокирует)


 
sniknik ©   (2008-05-22 16:49) [20]

> Странный какой то код
это пример, и да, в таком виде он действительно не работает как должен бы...


 
Анонимщики ©   (2008-05-22 16:51) [21]

Я говорил, что

while (1=1)
begin
  select @abcd = IDFile from lst_Files where FileSize = 336;
end;

не реагирует на таймаут точно так же, как и
while (1=1)
begin
  set @a = 0;
 end

Я не знаю, что такое WAITFOR DELAY, но не понимаю, какие выводы из Вашего сообщения нужно сделать?


 
Анонимщики ©   (2008-05-22 16:54) [22]

> Странный какой то код
--это пример, и да, в таком виде он действительно не работает как должен бы...

В нем нет в начале ADOStoredProc1.ExecProc, а перед отменой нужно проверять, получен результат или еще нет. А так оно работает. В чем странность?


 
Reindeer Moss Eater ©   (2008-05-22 17:13) [23]

ADOCommand1.CommandText:= "WAITFOR DELAY ""000:00:10""";
ADOCommand1.CommandTimeout:= 3;
ADOCommand1.Execute;
вываливается по таймауту через 3 сек, а не завершается через 10. (и вставленная в твой цикл задержка в 1 сек например, тоже его разблокирует)


У меня по таймауту отваливается и вот это:

while (1=1)
begin
  set @a = 0;
 end


 
Reindeer Moss Eater ©   (2008-05-22 17:16) [24]

дурили нас с самого начала


 
Reindeer Moss Eater ©   (2008-05-22 17:25) [25]

используй TADOCommand


 
Анонимщики ©   (2008-05-22 17:42) [26]

Так Вам нужно было проверить.
У Вас отваливается TADOCommand, а TADOStotedProc не отваливается?
Какая вас СУБД и какой провайдер, можете сказать?


 
sniknik ©   (2008-05-22 18:04) [27]

> Я не знаю, что такое WAITFOR DELAY,
задержка на период, или ожидание до указанного времени

> но не понимаю, какие выводы из Вашего сообщения нужно сделать?
while (1=1)
begin
 set @a = 0;
 WAITFOR DELAY "000:00:01"
end
проверь

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

> используй TADOCommand
я именно его и использовал (TADOStotedProc вообще ни под каким видом не пользую, даже для тестов)


 
Reindeer Moss Eater ©   (2008-05-22 18:11) [28]

D7, MSSQL2005, Native Client


 
Анонимщики ©   (2008-05-22 18:15) [29]

У Вас отваливается TADOCommand, а TADOStotedProc не отваливается?


 
Анонимщики ©   (2008-05-22 18:18) [30]

С TADOCommand  у меня то же самое


 
Анонимщики ©   (2008-05-22 18:19) [31]

Подозреваю, что вопрос все же в клиенте.
Как можно узнать, какие именно dll-и используются?


 
sniknik ©   (2008-05-22 19:44) [32]

> У Вас отваливается TADOCommand, а TADOStotedProc не отваливается?
у меня, если это ко мне, отваливается TADOCommand в случае с WAITFOR -> [27], и "висит" без него, если запрос как у тебя в -> [0], а что и как там с TADO/StoredProc(/Query/Table) мне пофигу, не пользовался и не буду, убраны с палитры компонент за ненадобностью.


 
Анонимщики   (2008-05-22 23:45) [33]

Я это спрашивал у Reindeer Moss Eater, поскольку у него хоть что-то работает.
А пользоваться можно чем угодно, главное умеючи.


 
Анонимщики ©   (2008-05-23 14:28) [34]

Можно узнать параметры ваших файлов sqlncli.dll? Я так понимаю, что это и есть реализация клиента поставщика данных для Native MS SQL. У меня этот файл находится в "C:\Windows\system32"

Мои данные:
Версия (файла) - 2005.90.1399.00
Дата - 14.10.2005
Версия (продукта) - 9.00.1399.06


 
Анонимщики   (2008-05-24 16:21) [35]

тук-тук


 
Анонимщики ©   (2008-05-27 15:52) [36]

Я хочу то же самое спросить у всех  прохожих. Поделитесь информацией.


 
sniknik ©   (2008-05-27 16:17) [37]

2005.90.3042.0
10 февраля 2007
9.00.3042.00

но пробовал не только с найтивным клиентом, со старым тоже (и на 2000-ом сервере), без разницы.

чем не устаривает изменить запрос?


 
Анонимщики ©   (2008-05-27 17:14) [38]

У меня проблемы не на запросе, а при сильной загрузке сервера.


 
Анонимщики ©   (2008-05-27 17:17) [39]

Но меня больше интересовал Reindeer Moss Eater, поскольку у него все хорошо.
У меня же с версией, как в [37], то же самое, что и изначально (в [34]).



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.043 c
11-1193584312
Danger
2007-10-28 18:11
2008.12.21
Подправить MCKmdvPanel.pas


4-1202719189
lead-in
2008-02-11 11:39
2008.12.21
Socket`ы или кривые руки


2-1226328530
@!!ex
2008-11-10 17:48
2008.12.21
класс, который не нужно создавать.


2-1226560852
Lera
2008-11-13 10:20
2008.12.21
Импорт из dbf файла через ADO


2-1226575325
Sveta
2008-11-13 14:22
2008.12.21
создание массива для button





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский