c# - 具有许多通知的 .NET SqlDependency 与高速率轮询?

标签 c# .net sql-server sql-server-2012 sqldependency


我有一个小表(大约 200 行),它一直在变化(每秒几次)。
我一直在寻找一种解决方案,每次它发生变化时我都可以收到来自数据库的通知,而不是轮询它(假设每秒 5-10 次)。

此外,我希望每次只接收更改的行而不是获取整个表 - 我发现这很难利用 SqlDependency 类来实现。

需要考虑的几件事:

  1. 除了使用数据库之外,我无法控制表中的更改,也无法接收数据。
  2. 我打算构建一个服务,将更改广播到我的前端服务器

有没有办法使用 SqlDependency 来做到这一点?

这种情况下的最佳做法是什么?

顺便说一句:我正在使用 SQL Server 2012

提前致谢

最佳答案

SqlDependency 只会通知您发生了更改,您将不得不重新读取整个表。它适用于低通知率。在高速率下,您必须考虑通知的成本很高。参见 The Mysterious Notification有关 SqlDependency 工作原理的更多详细信息。如您所见,成本很高:

  • 设置通知(写入 sys.dm_qn_subscriptions 和 SSB 系统表)
  • 触发通知(写入 sys.dm_qn_subscriptions)
  • 传递通知(写入 SSB 系统表、目标队列)
  • 接收通知(写入目标队列,SSB系统表)

这是相当多的写入,如果您不断收到通知,成本会很快增加。

但真正的问题是您希望在应用程序中如何对恒定的变化率做出准确的 react ?你想知道什么,那个东西改变了?好吧,你知道的,它总是如此,只要应用程序需要数据,它最好读取最新状态,因为它肯定发生了变化。轮询也没有意义。听起来你真正想要的是 change tracking或者,更有可能是基于定制的 queue of changes由变更发起人提供。

关于c# - 具有许多通知的 .NET SqlDependency 与高速率轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22660825/

相关文章:

c# - C# 和 Java 语法是 LALR(x) 吗?

c# - ASP.NET Forms Authentication,允许用户仅使用用户名访问特定页面

.net - Traefik不会路线

.net - 禁用 Azure Web Apps 中的自定义错误页面

sql - 递归 SQL 查询降序

sql - 使用拥有规则的多个分隔符(和 - )拆分 sql 中的数据

c# - redis c# 客户端,我如何获得订阅者计数?

c# - 将一个范围序列拆分成多个字符串c#,linq

c# - 根据DataGridView中的屏幕大小调整列宽(WinForms)

sql-server - 我可以在所有数据库上打开服务代理吗?