Почему получение компонента Service Broker займет больше времени, чем указанное время ожидания? - PullRequest
1 голос
/ 18 октября 2011

Я пишу приложение с высокой нагрузкой, которое использует SQL Server Service Broker.Я попал в состояние, когда выполнение следующего сценария в Management Studio занимает 1 минуту 6 секунд, даже после того, как я остановил приложение.Что может быть причиной того, что это займет так много времени?Я думал, что TIMEOUT остановит его через полсекунды?

WAITFOR (RECEIVE TOP(1) * FROM [targetqueuename]), TIMEOUT 500;
SELECT @@ERROR;

@@ ERROR возвращает 0. После первого запуска, выполняющего эту длинную процедуру, последующие циклы возвращаются мгновенно.

1 Ответ

3 голосов
/ 21 октября 2011

WAITFOR(RECEIVE), TIMEOUT работает, фактически запуская RECEIVE хотя бы один раз. Если результирующий набор пуст, он продолжает ждать. Каждый раз, когда он полагает, что это может быть успешным (он получает внутреннее уведомление о наличии большего количества сообщений), он снова запускает RECEIVE. Повторяйте в цикле, пока он не вернет строки или не истечет время ожидания.

Но тайм-аут не прерывает получение, уже выполняемое в этом цикле. Если для RECEIVE требуется много времени, чтобы найти сообщения в очереди (это может произойти с большими очередями или с плохими планами выполнения для RECEIVE), тайм-аут не может быть соблюден. Обратите внимание, что это может иметь место даже в том случае, если RECEIVE не находит какое-либо сообщение, поскольку очередь может содержать большое количество сообщений, которые все заблокированы (точнее, все принадлежащие заблокированным группам разговоров). В этом случае выполнение RECEIVE может занять много времени, поиск разблокированных групп разговоров и, в конце концов, все равно приходит с пустыми руками.

...