![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CommandTime Out
Анонимщики © (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;
Если же идет долгий селект, то очевидно при фетче сервер отвлекается на обработку таймаутов.