SqlDependency随时间丢失订阅

时间:2013-10-30 15:37:58

标签: c# sql-server-2008 .net-4.5 sqldependency

我在.NET 3.5应用程序中使用SqlDependency已超过3年没有任何问题。方案如下:

  1. 使用SqlDependency观看桌子的中央窗口服务(让我们称之为表A)
  2. 使用WPF应用程序的多个用户,每个用户使用唯一SqlDependency观看一个表(表A再次)
  3. 用户将一个工作单元排队,以便在表A中进行处理
  4. SqlDependency触发Windows服务
  5. Windows服务处理表A中的所有未完成项目并将结果保存到表A
  6. 为每个可用结果的用户触发唯一的SqlDependency
  7. 用户处理他们的工作
  8. 最近我将系统升级到.NET 4.5,并开始看到将更改放入我们正在监控的表中的问题,但SqlDependency永远不会触发(在服务和用户中)应用)。我开始深入研究这一点,并在我的日志中注意到,在某些时候我会重新注册SqlDependency,但之后通知将永远不会启动。

    看到此行为后,我决定在SQL Server上运行探查器来捕获订阅事件。从捕获的数据中,我注意到有时订阅将由一个用户注册(具有唯一ID),但随后将由另一个用户触发(具有相同的唯一ID)。这通常发生在我上面提到的服务和WPF应用程序的一个或多个用户身上。 (我在分析器结果中附上了该问题的屏幕截图)

    这是预期的行为吗?是否可以针对不同的用户触发通知?这是否指向应用程序层中的问题?任何帮助表示赞赏。

    Profiler Results

1 个答案:

答案 0 :(得分:3)

由于正在创建多个SqlDependency实例,我将检查重复订阅,如here所述。订阅可能会被视为重复,具体取决于您的配置。行为"表示如果为相同的查询请求通知,则只发送一个通知。"

要检查的另一件事是OnChange事件是否真的可以正常工作,但由于它在不同的线程上触发而不会出现。注意到SqlDependency的多线程特性here

Profiler跟踪指示Service Broker正在执行其工作。在.NET层中添加其他跟踪将显示订阅是在数据库级别触发,但不会导致OnChange事件触发。可以找到其他问题排查提示here