Недавно мы обнаружили проблему с одной из наших баз данных, когда в результате настройки «пожар и забыл» (т. Е. Разговоры закрываются сразу после отправки), наша таблица sys.conversation_endpoints заполнялась сообщениями DI / DISCONNECTED_INBOUND. Это в конечном итоге перетекло в базу данных tempDB, что привело к ее огромному росту и поглощению драгоценного дискового пространства. В конце концов мы решили эту проблему, закомментировав строку
END CONVERSATION @handle WITH CLEANUP
в нашем отправляющем SP и закрытии разговоров в нашем принимающем SP, используя тот же код,
END CONVERSATION @handle WITH CLEANUP
Однако теперь у нас есть новая проблема. После перемещения серверов (и перехода с SQL Server 2005 на SQL Server 2008) мы недавно обнаружили, что sys.conversation_endpoints теперь заполняется сообщениями CO / CONVERSING, указывающими, что диалоги не закрываются. Получающий SP закрывает их или, по крайней мере, запускает команду для этого, поэтому я не понимаю, откуда поступают эти сообщения.
Я пытался вернуться к завершению разговора в точке отправки, но это не имеет никакого эффекта. Разве неправильно завершать разговоры на принимающей стороне, используя WITH CLEANUP
? Или есть другая проблема?
Этот пост на techtarget , похоже, указывает на ошибку, и выполнение задания по очистке остатков - единственное решение ...
UPDATE:
Ниже Павел указал, что мне следует избегать паттерна Fire & Forget, и я добавил активированный SP в очередь инициатора, чтобы завершить любые разговоры. Однако sys.conversation_endpoints ПОЛНОСТЬЮ заполняется, на этот раз сообщениями CD / CLOSED. Вот структура моих очередей
Send_SP:
DECLARE @h UNIQUEIDENTIFIER
BEGIN DIALOG CONVERSATION @h
FROM SERVICE 'InitiatorQueue' TO SERVICE 'TargetQueue'
ON CONTRACT 'MyContract' WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @h MESSAGE TYPE 'MyMessage' (@msg)
Receive_SP (активированный SP в TargetQueue)
DECLARE @type SYSNAME, @h UNIQUEIDENTIFIER, @msg XML;
DECLARE @target TABLE (
[message_type_name] SYSNAME,
[message_body] VARBINARY(MAX),
[conversation_handle] UNIQUEIDENTIFIER
)
WHILE(1=1)
BEGIN TRANSACTION
WAITFOR(RECEIVE TOP (1000)
[message_type_name],[message_body],[conversation_handle]
FROM TargetQueue INTO @target), TIMEOUT 2000
IF(@@rowcount!=0)
BEGIN
WHILE((SELECT count(*) FROM @target) > 0)
BEGIN
SELECT TOP (1) @type = [message_type_name],
@msg = [message_body],
@h = [conversation_handle] FROM @target;
// Handle Message Here
END CONVERSATION @h;
DELETE TOP (1) FROM @target;
END
END
COMMIT TRANSACTION;
End_SP (активированный SP в InitiatorQueue)
DECLARE @type SYSNAME, @h UNIQUEIDENTIFIER, @msg XML;
DECLARE @init TABLE (
[message_type_name] SYSNAME,
[message_body] VARBINARY(MAX),
[conversation_handle] UNIQUEIDENTIFIER
)
WHILE(1=1)
BEGIN TRANSACTION
WAITFOR(RECEIVE TOP (1000)
[message_type_name],[message_body],[conversation_handle]
FROM InitiatorQueue INTO @init), TIMEOUT 2000
IF(@@rowcount!=0)
BEGIN
WHILE((SELECT count(*) FROM @init) > 0)
BEGIN
SELECT TOP (1) @type = [message_type_name],
@msg = [message_body],
@h = [conversation_handle] FROM @init;
END CONVERSATION @h;
DELETE TOP (1) FROM @init;
END
END
COMMIT TRANSACTION;