My SQL依赖关系工作正常,当应用程序退出时,代理队列和服务会正确删除(我确实执行SqlDependency.Stop(...)按照终止进程之前的建议),但我注意到由SQL依赖关系应用程序关闭后,仍保留在表“sys.dm_qn_subscriptions”中。
如果我稍后(应用程序关闭后)执行应该使此订阅触发的条件,它似乎确实会触发,因为 SQL Server 在事件查看器中记录一条信息消息,大意是:
对话句柄上的查询通知对话框'{3F03B693-C0A5-E211-A97B-E06995EBDB20}.'
由于以下原因关闭
错误:'<?xml version="1.0"?><Error
xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-8490</Code><Description>Cannot
find the remote service
'SqlQueryNotificationService-0ea1f686-e554-4e25-aa7d-4f6d85171cc3'
because it does not exist.</Description></Error>'
.
然后订阅将从“sys.dm_qn_subscriptions”中删除。
注意:当应用程序处于活动状态时,订阅也会正确触发。就我的应用程序而言,没有任何问题,但令我担心的是,一旦它们所依赖的代理队列/服务终止,订阅就不会在数据库系统表中自动擦除。这可能(至少)导致数据库中积累大量幻影/不死订阅记录,并导致事件查看器中不必要的 SQL Server 清理消息(每个应用程序运行都会在“sys.dm_qn_subscriptions”中生成新的不死记录)。
这种行为正常吗?事情可以变得更整洁吗?
这是正常行为。 QN 寿命很长,它们将在数据库重新启动时触发(因此在服务器重新启动后也会触发)。但SqlDependency
设置一个临时服务/队列来接收通知,并且在发生崩溃时应该使用对话计时器 http://msdn.microsoft.com/en-us/library/ms187804.aspx and 内部激活 http://msdn.microsoft.com/en-us/library/ms171585%28v=sql.105%29.aspx。这两种机制相互作用的方式就是您所看到的,ERRORLOG 污染。没有什么bad发生,至少通常不会 http://rusanu.com/2007/11/10/when-it-rains-it-pours/,但显然不整齐。
事情可以变得更整洁吗?
您可以直接使用来推出自己的解决方案SqlNotificationRequest http://msdn.microsoft.com/en-us/library/system.data.sql.sqlnotificationrequest.aspx它不再提供创建服务/队列来接收您的应用程序域通知并将其路由到适当的“服务”SqlDependency.OnChange
事件。根据具体情况,有可行的替代方案。但这是相当低水平的工作,你最终可能会以比原来更糟糕的方式解决问题SqlDependency
解决方案...
顺便说一句,应用程序退出时无法“删除”待处理的 QN 订阅。该问题是 QN 用作通知传递机制的单向对话所固有的。正确的通知(订阅)应该由订阅者发起,并且通知应该是从目标(通知者)返回到发起者(订阅者)的响应消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)