Тайм-аут хранимой процедуры - но хорошо при запуске из SSMS - PullRequest
3 голосов
/ 22 мая 2009

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

Используется код ADO / VB6.

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

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

Ошибка будет воспроизводиться каждый раз при сотнях попыток, независимо от того, запускает ли код VB6 в режиме отладки или нет, тогда внезапно все волшебным образом снова начнет работать. Тогда когда-нибудь в будущем эта проблема снова появится.

Я не уверен, сколько кода здесь разместить, в этом нет ничего сложного; это в основном;

Set adoCommandObject.ActiveConnection = ...{open ADODB.Connection object}
Set rs = CreateObject("ADODB.Recordset")
Call rs.Open(adoCommandObject, , adOpenForwardOnly, adLockReadOnly)'Timeout occurs here

Я наблюдал в профилировщике, но это не дало никаких подсказок, за исключением случайного просмотра инструкций "SET NO_BROWSETABLE ON" / "SET NO_BROWSETABLE OFF", возникающих до и после запуска sp.

Я искал в сети, но не смог найти удовлетворительной помощи для этого; Я готов попробовать что-нибудь на этом этапе (кроме переписывания в .NET, к сожалению, это не вариант!)

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Я думаю, что вы слишком много думаете об этом. Без обид, но если вы используете MSSQL, это так же просто, как если бы кто-то оставил окно запроса открытым и связал базу данных. Это легко проверить. У меня была такая же проблема раньше. Я запускал хранимые процедуры до того, как у них не было тайм-аута, которые обычно запускались бы немедленно, но сидели бы на ночь и не запускались. Только чтобы узнать, что другой сотрудник оставил окно запроса открытым. Закройте их окно и пуф, наконец, запускается. Проверьте это, вы будете удивлены тем, что блокировка таблицы может сделать с вашим приложением.

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

0 голосов
/ 22 мая 2009
  • Может быть, есть какой-то код, который случайно устанавливает тайм-аут соединения или команды на очень маленькое значение.
  • Может быть, процедура действительно иногда требует времени для запуска, например, если сервер делает что-то еще или статистика устарела
  • Можете ли вы зафиксировать случай тайм-аута с помощью профилировщика, и если да, то на самом деле процесс занимает много времени?

Как описано здесь SET NO_BROWSETABLE ON аналогично использованию FOR BROWSE в выборках. Я думаю, что он автоматически генерируется ado, когда он думает, что вы можете обновить этот набор записей. Вероятно, есть свойство Recordset, которое вы могли бы установить, чтобы остановить выдачу, но кажется маловероятным, что это проблема.

...