我想在我的项目中使用SqlDependency,但是我想要依赖的表正被几个程序用于非常重要的目的。所以他们必须能够在SqlDependency运行时插入这个表。这可能吗?
我已阅读this个问题,但未找到答案。
答案 0 :(得分:6)
要回答您的问题,SqlDependency不会“锁定”该表,但可能会在高写入环境中increase lock contention,因为它使用与索引视图相同的机制来检测对基础数据的更改。
但是,除非:
,否则它应该是合适的变化的频率可能很高。要定义“高”,你真的需要测试你的生态系统,但建议的指导方针是,如果你的数据每秒变化很多次,它可能不适合你:SqlDependency和回调的响应时间不保证机制不是为了可靠地处理许多并发更改而设计的,您需要通知每次更改。此外,SqlDependency可以增加对基础表的阻塞/争用,因为用于跟踪更改的索引可能形成一个高频率写入的瓶颈。
您打算将SqlDependency构建到一个客户端应用程序(例如桌面应用程序)中,该应用程序直接访问数据库,并且会有许多实例。在这种情况下,大量的侦听器,队列和消息可能会影响数据库性能,效率很低。在这种情况下,您需要在考虑SqlDependency之前在数据库和应用程序之间放置一些中间件。
您需要可靠地通知每一次更改。 SQL Server中SqlDependency的基础机制将为每个更改生成一个通知,但.NET方面本身并不是为了以多线程方式处理它们:如果在SqlDependency的工作线程已处理另一个通知时收到通知,它会被遗漏。在这种情况下,您可以改为使用SqlNotificationRequest。
您需要立即通知更改(即保证亚秒级)。 SqlDependency不是低延迟的;它专为缓存失效方案而设计。
如果SqlDependency不合适,请查看MSDN上的Planning for Notifications和基础Query Notifications页面,以获取更多有关替代方案的指导和建议。否则请参阅下文,了解有关如何根据正在使用的基础技术评估性能的更多详细信息。
SqlDependency在很大程度上依赖于两种关键的SQL Server技术:query notifications(基于indexed views)和service broker。它有效地挂钩了每当底层数据发生变化时更新索引视图的机制。它为每个更改向队列添加消息,服务代理处理消息传递和通知。在写入频率非常高的情况下,SQL Server将努力处理写入,使其“索引视图”保持最新,以及排队和提供许多结果消息。如果您需要近乎即时通知,这可能仍然是最佳方法,否则请查看轮询或使用更新后触发器,该触发器可能使用Service Broker作为suggested on MSDN。< / p>