Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CommandTime Out


Страницы:   1 2

Анонимщики ©   (2008-05-22 15:07:00) 

Delphi2007, MS SQL 2005; SQL Native Client; ADO

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

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

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


sniknik   (2008-05-22 16:48:00) [21]

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


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

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


Anatoly Podgoretsky   (2008-05-22 16:34:00) [23]

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

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


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

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


Reindeer Moss Eater   (2008-05-22 16:01:00) [25]

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


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

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


Reindeer Moss Eater   (2008-05-22 15:55:00) [27]

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


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

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


Reindeer Moss Eater   (2008-05-22 15:51:00) [29]

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

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


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

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

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

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

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


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

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

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;


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


Reindeer Moss Eater   (2008-05-22 15:37:00) [32]

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


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


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

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

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

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


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

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

логика.


sniknik   (2008-05-22 15:33:00) [35]

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

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


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

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


Reindeer Moss Eater   (2008-05-22 15:27:00) [37]

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


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

Меня причина интересует только для того, чтобы проблему можно было обойти.
К тому же, видимо, ответ угадан неверно (могу привести косвенные аргументы).
Кроме того, у меня была надежда, что таймаут контролируется на клиенте, а не на сервере, поскольку в хелпе написано, в частности, следующее:
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:19:00) [39]

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

BBreak := False;

repeat
until BBreak;

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо