1

这让我把头发拉出来。我们有一个工作流,托管为 WCF 服务,它调用另一个 WCF 服务,然后调用存储过程。存储过程调用合并,然后遍历调用另一个存储过程的游标。游标计数与合并中的源计数相同。如果源计数很高(~120k),sproc 永远不会返回。磁盘活动和 CPU 利用率为零,并且内存没有被征税。如果我然后从 SSMS 调用存储过程,它会在大约一个小时内完成。

我们正在使用 SQLDataAdapter 进行实际调用。SDA 是否以某种方式在每次游标迭代时接收更新然后失败,导致 SQL 在等待时停止?还是发生了其他事情?

我提出了 SDA,因为我花了一周的前半部分时间来追踪工作流故障的原因,结果发现这是一个重复的 ANSI 警告消息被返回到 SDA 并导致内存不足异常。这让我想知道这里是否还有其他事情发生,导致问题。

4

3 回答 3

1

我严重怀疑 WCF 主机是否适合将数据库调用持续一小时...我建议您查看异步过程执行,它允许您以可靠的方式从 ASP/WCF 进程进行长时间的数据库调用, 并调用让 HTTP 调用返回给调用者。

于 2010-08-13T00:30:59.677 回答
0

很难说出您的代码实际上在做什么,但您提到您的存储过程正在使用游标并且您的存储过程很慢。我编写存储过程以使用临时表,并按照以下示例所示遍历临时表。当我使用游标时,这使我的 procs 在几秒钟到几分钟内运行,而它们过去需要几分钟到几小时。如果您正在使用游标并且分析表明存储过程中的游标代码很慢,请尝试使用临时表。

你永远不会回到游标。

-- create a temporary table
DECLARE @FrontDeskRows table (
    id int,
    Arrival datetime,
    Departure datetime,
    CheckedIn int,
    OwnerID varchar(50),
    GuestID varchar(50),
    [LName] varchar (256),
    [FName] varchar (256),
    [Address] varchar (256),
    [City] varchar (256),
    [State] varchar (256),
    [Zip] varchar (256),
    [phone] varchar (256),
    [Status] int )

-- load your temporary table
INSERT INTO @FrontDeskRows
  SELECT  id,
      Arrival,
      Departure,
      CheckedIn,
      OwnerID,
      GuestID,
      [LName],
      [FName],
      [Address],
      [City],
      [State],
      [Zip],
      [phone],
      [Status]
  FROM FrontDesk
  ORDER BY Id ASC

DECLARE @arrival as DateTime
DECLARE @departure as DateTime
DECLARE @id as int

-- loop over the temprary table
SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows)
SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id
SELECT @departure = Departure FROM @FrontDeskRows Where id = @id
  WHILE @id IS NOT NULL
   BEGIN

    -- PROCESS EACH ROW HERE

    -- get the next item in the temporary table
    SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows WHERE id > @id)
    SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id
    SELECT @departure = Departure FROM @FrontDeskRows Where id = @id

   END
于 2010-08-13T03:35:25.337 回答
0

事实证明,这是一个非常糟糕的参数嗅探案例。非常非常糟糕的情况...

于 2010-08-18T16:35:01.397 回答