1

我有一个简单的 Biztalk 应用程序 2013-r2 将文件导入表中,然后执行长时间运行的导入后过程(通过存储过程)。

症状:导入2个文件时

  • 第一个文件的导入没有问题
  • 然后,后处理开始(由于长时间运行的存储过程,如预期的那样慢)
  • 然后,如果您删除第二个文件,则第一个文件后处理消失并进行第二次导入。
  • 然后它们开始来回交替(您可以看到后处理字段按预期填充)
  • 两个发送端口都处于活动状态,有时您会看到第三个端口脱水

由于没有报告错误,这必须是一个设置,还是我需要将后期处理移出长期运行的事务?

细节:

  • 编排事务类型长时间运行
  • 后处理发送端口的超时时间为 59 分钟
  • 后处理存储过程调用子存储过程。
  • 任何地方都不会报告错误
  • 两个发送端口都已订购交货检查

在此处输入图像描述

后处理存储过程:

    CREATE PROCEDURE [sync].[MPostProcessing]
        @Code NVARCHAR(2)
    AS 

    ----
    ---- 2. Normalize Address
    ----
    IF @Code = '99'
        EXEC sync.AElBatch @Code = @Code


CREATE PROCEDURE [sync].[AElBatch ] @Code AS VARCHAR(2)
AS 
    DECLARE @ID AS INT

    WHILE EXISTS ( SELECT   ID
                   FROM     sync.[mtable]
                   WHERE    Code = @Code
                            AND PostProcessingDone = 0 ) 
        BEGIN

            SELECT TOP 1
                    @ID = ID
            FROM    sync.[mtable]
            WHERE   Code = @Code
                    AND PostProcessingDone = 0



            EXEC sync.PParse @ID = @ID


            UPDATE  sync.[mtable]
            SET     PostProcessingDone = 1
            WHERE   Code = @Code
                    AND ID = @ID

        END

然后 PParse 存储过程执行更多操作(所有工作,未报告错误)

Biztalk 服务器管理控制台的图像

在此处输入图像描述

4

1 回答 1

1

所以这对于评论来说太长了,但我仍然不能 100% 确定你的问题。无论哪种方式:

看来您的 SP 可能存在一些问题。重构它们以使用基于集合的查询而不是while循环(或游标,如果有的话)。强制 SQL Server 将每个单独的标量变量作为单独的调用处理将阻止它完全优化它正在执行的任何操作sync.PParse- 将表变量传递给它或者如果需要,它可以正确并行化它并停止如此糟糕.

它很可能sync.PParse有一个错误,它正在读取它不应该读取的数据。这些行尤其AElBatch令人不安:

        SELECT TOP 1
                @ID = ID
        FROM    sync.[mtable]
        WHERE   Code = @Code
                AND PostProcessingDone = 0

您可能希望在其中添加某种批处理标识符,以便 PostProcessing#2 不会开始获取 PostProcessing#1 的真正含义。

仔细检查发生了什么sp_who2,看看事情是否被阻止。即使没有正确显示错误,那里也可能正在发生某些事情。

最后,如果这些都不起作用,您可能必须将它们变成 BizTalk 调用的单个 SP,以便Ordered Delivery将两个作业保持在同一个队列中 - 而不是允许文件加载 #2 在后处理作业 #1 之前完成完毕。

于 2016-02-02T15:14:43.567 回答