【问题标题】:do we have to write while (1=1) in activation stored procedures for service broker queues always or it's an optional?我们是否必须始终在服务代理队列的激活存储过程中写入 while (1=1) 或者它是可选的?
【发布时间】:2017-09-08 06:56:14
【问题描述】:

例如:

Create Proc test_act_sp  
AS  
    BEGIN  
        WHILE (1=1)  
            BEGIN  
                WAITFOR  
                (  
                    RECIEVE TOP(1) FROM Queue  
                )  
            ........
            ........
            ........
        END
    END

【问题讨论】:

    标签: sql-server service-broker


    【解决方案1】:

    一般的代码是这样的

    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 循环减少了服务器的开销。

    可以省略循环,但在这种情况下,将为队列中的每条消息触发激活过程,这可能会导致性能问题。

    【讨论】:

    • 我知道它已经被回答了一段时间,但不是每次消息进入队列时都会激活激活程序吗?或者您是说在这里使用while 不会在有新消息时再次激活它?另外,为什么在激活过程中需要waitfor?再次,消息进来,程序激活,receive 命令会立即得到它,为什么要等待?
    【解决方案2】:

    这取决于您是否要连续处理队列。 (1=1) 始终为true 并创建一个无限循环,在该循环中它将等待一个项目出现在队列中并对其进行处理。

    如果您想创建一个只处理单个项目的激活过程,则根本不需要循环。

    【讨论】:

      【解决方案3】:

      WHILE 后面一定有一些 boolean 表达式(即 truefalse),这是命令的语法.

      如果你想编写一个无限循环的WHILE 循环,你必须编写一些总是返回true 的表达式。 1=1是其中之一,但你可以写任何总是返回true的东西(比如0=010=10

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 1970-01-01
        • 2013-04-23
        • 2021-04-26
        • 2020-02-02
        • 2022-10-24
        • 2023-03-18
        • 1970-01-01
        • 2018-02-22
        相关资源
        最近更新 更多