我使用表作为消息队列,并使用SqlDependency“注册”以获取更新。我读到的每个地方的人都在说要注意它的局限性,但没有具体说明它们是什么。从我收集的内容来看,当表具有非常高的更新频率时,你会遇到问题,幸运的是我只看到每分钟最多10-20个值。
对SqlServer有哪些其他限制/影响?
答案 0 :(得分:61)
我能找到的最完整的清单(from here)如下:
其他参考文献:
答案 1 :(得分:12)
除此之外,对于任何考虑使用SqlDependency接收有关更改通知的人,我一直在生产中使用这种方法,而且我发现它有问题。我正在研究它是否与我的代码有关,但主要问题是:
如果您快速连续触发多个更改,则不会始终获得与代码相同数量的事件。在我的代码中,如果一个接一个地插入2个新记录,我只收到一个通知(对于最后一个)。
无法知道添加的记录。因此,如果您添加新记录,并且代码触发以接收通知,则代码无法知道该新记录的ID,因此您需要在数据库中查询该记录。
答案 2 :(得分:9)
花了一天时间追逐SQL Service Broker无法正常工作的问题,根本原因是在存储过程中引用了数据库。
例如,这个select
在SQL Management Studio中运行良好:
select [MyColumn] from [MyDatabase].[MySchema].[MyTable]
但是,SQL Service Broker拒绝了这一点,因为我们在select语句中引用了数据库,而来自SqlDependency
的回调在Invalid
中返回SqlNotificationEventArgs e
,请参阅{{ 3}}
将传递给SqlDependency的SQL更改为以下语句消除了错误:
select [MyColumn] from [MySchema].[MyTable]
上面的示例只是SQL Service Broker依赖的SQL语句的许多限制之一。有关限制的完整列表,请参阅http://msdn.microsoft.com/en-us/library/ms189308.aspx。
原因? SQL Service Broker使用的SQL语句在后台转换为监视What are the limitations of SqlDependency数据库更改的指令。此监视在SQL Server的核心中执行,这使得在检测对表的更改时非常快。但是,这个速度是有代价的:你不能只使用任何SQL语句,你必须使用一个可以转换成指令来监视SQL Transaction Log。
答案 3 :(得分:3)
我对此技术的另一个重大问题是:订阅者连接需要具有“创建过程”权限。我工作的应用程序的Web服务层目前作为受限用户运行。要使用SQLDependency设置通知,我必须打开该用户来创建过程。听起来像是在拥有自己的道路上迈出了相当不错的一步。
答案 4 :(得分:2)
要克服这些限制,您可以尝试使用SqlTableDependency。 看看www.sqltabledependency.it
答案 5 :(得分:0)
它使用Service Broker。因此,它不适用于非托管SQL Azure实例。因此,如果您使用SQL Azure或曾经使用过,请保持谨慎。
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-features
服务经纪人
受单个数据库和弹性池支持:
否
受托管实例支持:
是的,但仅在实例内。 参见Service Broker differences
因此,除非您的所有环境都可以使用它,否则可能不太合适!