我目前的情况是,当新数据到达数据库表时,需要通知应用程序。数据来自一个外部源(我无法控制它--这是唯一的集成选项)。当新数据到达时,我的应用程序需要采取某些操作--基本上是查询新数据,处理它,将结果插入本地表,等等。
如果可能的话,我希望避免轮询,因为数据需要实时处理。也就是说,确保没有任何数据被遗漏是第一要务。
我的问题:
发布于 2012-09-17 06:58:25
1)是的,我认为它是可靠的,就像它正确地做了设计的目的一样(缓存失效)
( 2)否。这就是为什么您只能通过发出查询来订阅,这可以确保在获取数据和发出通知的新更新之间不存在任何竞争。
3)数据库(或实例)重新启动信号,所有挂起的查询通知的SqlNotificationInfo值为Restart。阅读SqlDependency and is based on Query Notification如何更好地理解。由于SqlDependency始终保持到数据库的打开连接,SqlDependency将在任何显式查询通知之前就检测到数据库不可用性。
( 4)否。更多关于这个的更深入..。
5)没有漏掉的数据。查询通知(因此也包括SqlDependency)从不通知您哪些数据发生了更改。它只会通知你它改变了。你总是应该回去,把所有的数据读回来,看看发生了什么变化(我建议你回到第二个问题/答案)。新启动的应用程序尚未开始查询数据,因此不需要通知更改。只有在第一次查询数据之后,它才能收到通知。
从对您问题的描述来看,我不认为您需要查询通知。在我看来,您似乎希望对任何更改采取行动,而不管何时发生,即使您的应用程序没有运行,也是如此。这肯定不是缓存失效,而是更改跟踪。因此,您需要部署一种更改跟踪技术,如Change Data Capture或Change Tracking,这两种技术都是Server 2008及更高版本(在Server 2005中不可用)。使用Server 2005,部署触发器并为Service Broker排队以处理您要处理的相同问题并不少见(检测更改,对每一行新数据作出反应)。
发布于 2014-01-20 14:56:11
从.net开发人员的角度来看,它只是想将它用于缓存失效,这是一个真正的痛苦,而且不是完全可靠的。
设置和故障排除特别痛苦,我们让它在一个环境中正常工作,但在另一个环境中却不起作用。弄清楚为什么这么困难而且费时。
即使它全部运行,它也不是完全可靠的。如果Server在重载下删除通知,并且在重新启动和通知未恢复时存在已知问题,则Server可以删除通知:http://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql-server-restarts。
如果有一种替代的技术,它可以做你想做的事情,而且不那么麻烦,我会避免的。
https://stackoverflow.com/questions/12452488
复制相似问题