2012-09-17 680 views
37

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

如果可能,我想避免轮询,因为数据是预计将实时处理。这就是说,确保没有数据错过是首要任务。

我的问题:

  1. 是的SqlDependency通常被认为是可靠的?
  2. 我是否需要关注比赛条件,例如当另一个人到达时,我正在处理一个变化?
  3. 数据库重新启动时会发生什么?我的应用程序是否会恢复并重新开始接收更改,或者是否需要某种会定期重新订阅通知的故障安全计时器?
  4. 我已阅读的主题地址中的大部分文章都是针对SQL Server 2005的。我正在使用SQL Server 2008 R2。是否有一种比SqlDependency更受欢迎的新技术?
  5. (编辑)另外,如果应用程序停机怎么办?我想我将不得不查询启动时丢失的数据?
+0

当您说您的应用程序需要执行数据库操作时,db是否可以仅执行这些操作? – Kermit

回答

52

1)是的,我认为这是可靠的,在它正确的目的是为了做(缓存失效)

2)号这就是为什么你只能通过发出一个查询认购,这确保数据获取和新更新之间没有竞争通知

3)数据库(或实例)重新启动信号的所有待处理查询通知的SqlNotificationInfo值为Restart。请阅读SqlDependency and is based on Query Notification以获得更好的理解。作为SqlDependency保持一个开放连接到数据库的时候,数据库的可用性将被SqlDependency即使任何明确的查询通知

4)在此进一步下跌更多号之前检测...

5)没有'错过的数据'。查询通知(因此SqlDependency)从未通知您什么数据改变。它只是通知你,它改变了。你总是应该回去看全部回数据回 看看发生了什么变化(我将你引回问题/答案2)。新开始的应用程序尚未查询数据,因此没有任何更改需要通知。只有之后它首先查询了数据是否可以收到通知。

从你的问题描述我不相信你需要查询通知。在我看来,即使您的应用程序没有运行,您也想要对任何更改采取行动,无论发生何时发生,。这肯定不是缓存失效,它是更改跟踪。因此,您需要部署一个更改跟踪技术,如Change Data CaptureChange Tracking,这两者都是SQL Server 2008及更高版本(不适用于SQL Server 2005)。使用SQL Server 2005部署触发器并排队消息Service Broker以处理您尝试处理的相同问题(检测更改,对每行新数据作出反应)并不罕见。

+0

关于您的最后一点,当应用程序启动时,它将查询所有数据以查看尚未处理的内容 - 与收到通知时相同。我认为我的问题的措辞可能没有误导 - 我认为我需要解决的问题与缓存相同,即使它与缓存无关。也就是说,我会阅读你提供的所有链接,并重新考虑我的方法。谢谢你的出色答案。 –

+0

@Remus Rusanu,我阅读了您的精彩博客文章,但是如果“当SQL Server 2005重新启动时,所有查询通知订阅都会得到通知并结束,它甚至会对缓存失效有用”。看起来,如果服务器控制订阅期限,那么无法保证缓存一致性?我的用例是刷新弹性搜索索引。 –

+1

@JohnZabroski服务器无法保证实例脱机时没有数据发生更改。例如,管理员可能已经复制并替换了数据库文件。我建议你问一个单独的问题。 –

4

即将它从视图只是想使用它的缓存失效,它一直是真正的痛苦,而不是完全可靠的.NET开发人员的点。

设置和故障诊断一直都特别痛苦,我们得到它的工作好了一个环境,但随后它并没有在其他工作。搞清楚为什么困难和耗时。

即使全部运行,它也不是完全可靠的。如果SQL Server在负载较重的情况下可以删除通知,并且存在重新启动和通知不恢复的已知问题:http://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql-server-restarts

如果有替代技术,你想要做什么,少麻烦我会避免。

+1

如果说如果存在的话使用替代方法会更好吗?你知道另一个选择吗? – Noctis

+0

可能有点晚,但您可以尝试https://github.com/dyatchenko/ServiceBrokerListener/issues – Choco