我们是否必须始终在服务代理队列的激活存储过程中编写 while (1=1) 还是可选的?
do we have to write while (1=1) in activation stored procedures for service broker queues always or it's an optional?
w=12=will.year:w=11=will
w=10=sh
必须有一些 boolean 表达式(例如 true 或 false)他WHILE
,这是命令的语法。
如果您想编写一个 WHILE
无限循环,您必须编写一些始终 return 为真的表达式。 1=1
是其中之一,但您可以写任何始终 return true(例如 0=0
、10=10
)
这取决于你是否要连续处理队列。 (1=1)
始终 true
并创建一个无限循环,在该循环中它将等待一个项目出现在队列中并对其进行处理。
如果你想创建一个只处理单个项目的激活过程,你根本不需要循环。
一般代码是这样的
Create Proc test_act_sp
AS
BEGIN
WHILE (1=1)
BEGIN
WAITFOR
(
RECIEVE TOP(1) ... FROM Queue
) , TIMEOUT 3000; --Timeout value can be changed.
IF (@@ROWCOUNT = 0)
BEGIN
BREAK;
END
........
........
........
END
END
激活程序在无限循环中开始消息处理,如果在超时间隔(上例中为 3 秒)内没有收到任何消息,程序将终止。
如果我们有大量消息发送到队列,激活程序将启动并为所有集合加载一次内存(因为它在激活后等待消息),并在 3 秒后关闭最后收到的消息。因此,本例中的 while 循环减少了服务器的开销。
可以省略循环,但在这种情况下,将为队列中的每条消息触发激活过程,这可能会导致性能问题。
必须有一些 boolean 表达式(例如 true 或 false)他WHILE
,这是命令的语法。
如果您想编写一个 WHILE
无限循环,您必须编写一些始终 return 为真的表达式。 1=1
是其中之一,但您可以写任何始终 return true(例如 0=0
、10=10
)
这取决于你是否要连续处理队列。 (1=1)
始终 true
并创建一个无限循环,在该循环中它将等待一个项目出现在队列中并对其进行处理。
如果你想创建一个只处理单个项目的激活过程,你根本不需要循环。
一般代码是这样的
Create Proc test_act_sp
AS
BEGIN
WHILE (1=1)
BEGIN
WAITFOR
(
RECIEVE TOP(1) ... FROM Queue
) , TIMEOUT 3000; --Timeout value can be changed.
IF (@@ROWCOUNT = 0)
BEGIN
BREAK;
END
........
........
........
END
END
激活程序在无限循环中开始消息处理,如果在超时间隔(上例中为 3 秒)内没有收到任何消息,程序将终止。
如果我们有大量消息发送到队列,激活程序将启动并为所有集合加载一次内存(因为它在激活后等待消息),并在 3 秒后关闭最后收到的消息。因此,本例中的 while 循环减少了服务器的开销。
可以省略循环,但在这种情况下,将为队列中的每条消息触发激活过程,这可能会导致性能问题。