44

我目前的情况是我有一个应用程序需要在新数据到达数据库表时得到通知。数据来自外部来源(我无法控制——这是唯一的集成选项)。当新数据到达时,我的应用程序需要采取某些操作——基本上是查询新数据、处理它、将结果插入本地表等。

如果可能的话,我想避免轮询,因为数据应该是实时处理的。也就是说,确保不会丢失任何数据是第一要务。

我的问题:

  1. SqlDependency 通常被认为是可靠的吗?
  2. 我是否需要关注竞争条件,例如当另一个更改到达时我正在处理一个更改?
  3. 当数据库重新启动时会发生什么?我的应用程序会恢复并再次开始接收更改,还是需要某种故障安全计时器来定期重新订阅通知?
  4. 我读过的大部分文章都是关于 SQL Server 2005 的主题。我使用的是 SQL Server 2008 R2。是否有比 SqlDependency 更受欢迎的新技术?
  5. (编辑)另外,如果应用程序出现故障怎么办?我想我必须在启动时查询丢失的数据?
4

2 回答 2

55

1)是的,我认为它是可靠的,因为它正确地完成了设计目的(缓存失效)

2) 不可以。这就是为什么您只能通过发出查询来订阅的原因,这样可以确保在获取数据和通知新更新之间没有竞争

3) 数据库(或实例)重新启动信号所有挂起的查询通知,其SqlNotificationInfo值为Restart。阅读SqlDependency 和如何基于 Query Notification以获得更好的理解。由于始终保持与数据库的打开连接,因此甚至在任何显式查询通知之前SqlDependency都会检测到数据库不可用SqlDependency

4)不。更多关于这进一步...

5) 没有“丢失的数据”。查询通知(以及因此的 SqlDependency)永远不会通知您更改了哪些数据。它只通知您它已更改。您总是应该返回并读取所有数据以查看发生了什么变化(我建议您返回第 2 个问题/答案)。新启动的应用程序还没有查询到开始的数据,因此没有需要通知的更改。只有它第一次查询数据后才能收到通知。

根据您对问题的描述,我不相信您需要查询通知。在我看来,您想对任何更改采取行动,无论何时发生,即使您的应用程序没有运行。这当然不是缓存失效,而是更改跟踪。因此,您需要部署变更跟踪技术,例如Change Data CaptureChange Tracking,这两种技术都仅适用于 SQL Server 2008 及更高版本(在 SQL Server 2005 中不可用)。使用 SQL Server 2005 部署触发器并为Service Broker排队消息以处理您尝试处理的相同问题(检测更改、对每一行新数据做出反应)的情况并不少见。

于 2012-09-17T06:58:25.387 回答
5

从 .net 开发人员的角度来看,只是想将其用于缓存失效,这是一个真正的痛苦,而且并不完全可靠。

设置和故障排除特别痛苦,我们让它在一个环境中正常工作,但在另一个环境中却无法工作。找出原因既困难又耗时。

即使它全部运行,它也不是完全可靠的。如果 SQL Server 负载过重并且存在已知问题与它重新启动和通知不恢复,则 SQL Server 可以丢弃通知:http ://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql -服务器重启

如果有替代技术可以满足您的需求并且不那么麻烦,我会避免。

于 2014-01-20T14:56:11.583 回答