flu*_*luf 42 c# sql-server-2005 sqldependency
我使用表作为消息队列,并使用SqlDependency"注册"以获取更新.我读到的每个地方的人都在说要注意它的局限性,但没有具体说明它们是什么.从我收集的内容来看,当表具有非常高的更新频率时,你会遇到问题,幸运的是我只看到每分钟最多10-20个值.
对SqlServer有哪些其他限制/影响?
Smu*_*202 61
我能找到的最完整的清单(从这里)如下:
其他参考:
Mat*_*rts 12
除此之外,对于其他任何考虑使用SqlDependency接收有关更改的通知的人,我一直在生产中使用这种方法,我发现它有问题.我正在调查它以查看问题是否与我的代码有关,但主要问题是:
如果您快速连续触发多个更改,则不会始终获得通过代码的相同数量的事件.在我的代码中,如果一个接一个地插入2个新记录,我只收到一个通知(对于最后一个).
无法知道添加的记录.因此,如果您添加新记录,并且代码触发以接收通知,则代码无法知道该新记录的ID,因此您需要查询数据库.
花了一天时间追逐SQL Service Broker无法正常工作的问题,根本原因是在存储过程中引用了数据库.
例如,这select在SQL Management Studio中工作正常:
select [MyColumn] from [MyDatabase].[MySchema].[MyTable]
Run Code Online (Sandbox Code Playgroud)
但是,这是由SQL Service Broker的拒绝,因为我们是在SELECT语句引用数据库,并从回调SqlDependency回来与Invalid中SqlNotificationEventArgs e,见http://msdn.microsoft.com/en-us/library/ms189308.aspx.
将传递给SqlDependency的SQL更改为以下语句消除了错误:
select [MyColumn] from [MySchema].[MyTable]
Run Code Online (Sandbox Code Playgroud)
上面的示例只是SQL Service Broker依赖的SQL语句的许多限制之一.有关限制的完整列表,请参阅SqlDependency的限制.
原因?SQL Service Broker使用的SQL语句在后台转换为监视SQL事务日志以获取对数据库的更改的指令.此监视在SQL Server的核心中执行,这使得在检测对表的更改时非常快.但是,这种速度是有代价的:您不能只使用任何SQL语句,您必须使用一个可以转换为指令来监视SQL事务日志.
请注意,您不能在存储过程中使用nolock提示,否则依赖项将始终无效,因此您在其上创建的任何缓存将永久地重新查询数据库.
with (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
这似乎没有在文档中提及(据我所知)
在过程脚本之前,需要以下SET选项
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
Run Code Online (Sandbox Code Playgroud)
其他人则认为这些SET选项也是必需的,但我不认为它们是.不管怎么说,这样设置就好了.
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON
Run Code Online (Sandbox Code Playgroud)