SqlDependency可靠性?
我目前的情况是,我有一个应用程序,当新的数据到达数据库表时需要通知。 数据来自外部来源(我无法控制 – 这是唯一的集成选项)。 当新的数据到达时,我的应用程序需要采取某些行动 – 基本上查询新的数据,处理它,将结果插入本地表等。
我希望尽可能避免轮询,因为数据可望实时处理。 这就是说,确保没有数据被忽略是首要任务。
我的问题:
- SqlDependency通常被认为是可靠的吗?
- 我是否需要关注竞争条件,例如,当另一个人到达时,我正在处理一个变化?
- 数据库重新启动时会发生什么? 我的应用程序是否会恢复并重新开始接收更改,或者是否需要某种会定期重新订阅通知的故障安全计时器?
- 我已阅读的主题地址的大部分文章地址SQL Server 2005.我正在使用SQL Server 2008 R2。 有一种比SqlDependency更受欢迎的新技术吗?
- (编辑)另外,如果应用程序停机怎么办? 我想我将不得不查询启动时错过的数据?
1)是的,我认为它是可靠的,因为它正确的目的是为了做(caching失效)
2)不可以。这就是为什么你只能通过发出一个查询来订阅的原因,这就确保了在获取数据和新的更新通知之间没有竞争
3)数据库(或实例)重新启动信号的SqlNotificationInfo
值Restart
启动信号的所有挂起的查询通知。 阅读如何SqlDependency和基于查询通知更好的理解。 由于SqlDependency
始终保持与数据库的开放连接,即使在显式查询通知之前, SqlDependency
也会检测到数据库不可用
4)没有更多的进一步下降…
5)没有“错过的数据”。 查询通知(因此SqlDependency)从来没有通知你什么数据改变。 它只是通知你, 它已经改变了 。 你总是应该回去阅读所有的数据,看看有什么变化(我把你引回问题/答案2)。 新开始的应用程序尚未查询数据,因此没有任何变化可以通知。 只有在第一次查询数据后才能收到通知。
从你的问题的描述我不相信你需要查询通知。 在我看来, 即使您的应用程序没有运行 ,您也想要在发生任何变化时采取行动。 这当然不是caching失效,它是跟踪变化。 因此,您需要部署更改跟踪技术,例如更改数据捕获或更改跟踪 ,这两者都是SQL Server 2008及更高版本(SQL Server 2005中不可用)。 对于SQL Server 2005来说,部署一个触发器并排队一个消息给Service Broker来处理你正在尝试处理的同样的问题(检测变化,对每一行新数据做出反应)并不罕见。
从.net开发者的angular度来看,它只是想用它来caching失效,这是一个真正的痛苦,并不是完全可靠的。
设置和故障排除一直是特别痛苦的,我们得到它在一个环境中工作正常,但它不能在另一个环境中工作。 搞清楚为什么困难和耗时。
即使全部运行,也不是完全可靠的。 如果SQL Server在负载较重的情况下可以删除通知,并且存在重新启动和通知不恢复的已知问题: http : //connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql服务器重新启动 。
如果有一种替代技术可以做到你想做的事情,那么我会避免麻烦。