技术开发 频道

改进SQL Server服务代理的性能

我的接收程序非常简单:

CREATE PROCEDURE [dbo].[util_ProcessDelMonitorData]
@MsgToRead INT = 1000
AS
DECLARE @message_type_name sysname;
DECLARE @message_body VARBINARY(max)
DECLARE @msgTable TABLE
(
message_body
VARBINARY(max),
[conversation_handle] UNIQUEIDENTIFIER
);
BEGIN
DECLARE @conversation_handle UNIQUEIDENTIFIER
WHILE 1=1
BEGIN
WAITFOR (RECEIVE TOP (1) @Message_Body = message_body,
@conversation_handle = [conversation_handle]
@message_type_name = message_type_name
FROM [Q_ObjectDelete_Destination]), TIMEOUT 1000
    
IF @conversation_handle IS NULL
BEGIN
break
END
IF @message_type_name = MT_ConversationSwitch
END CONVERSATION @conversation_handle
    
IF @message_body IS NOT NULL
BEGIN
INSERT INTO @msgTable
(message_body,
[conversation_handle])
values
(
@message_body@conversation_handle)
END
    
SET @conversation_handle = NULL
SET @message_type_name = NULL
END
/*Business Logic happens here*/
END
GO

  你可以看到,我会对于第一条消息做标准的接收。如果消息没有发现值,我会转而处理我之前存储在@msgTable表变量中的数据。

  如果消息类型message_type_name是MT_ConversationSwitch,我会对该会话做一个中止会话(END CONVERSATION)的操作。

  如果@message_body变量中有数据,我会将该值存储到表变量中,给后面的业务逻辑进行处理。

  另外在发送队列中还有一个激活的程序,它只是对它接收的每一个消息做简单的中止会话(END CONVERSATION)操作。

  我真心希望这个例子能对你有所帮助。如果你对此有任何问题,请提交你的问题,我将尽快地回复你。

0
相关文章