SQLDependency挂一段时间后失效。

FainSheeg 2018-03-12 03:14:55
如题,使用SQLDependency来监测数据库改变,代码已实现,功能正常。
但是有时候挂一段时间后就失效了,不能再随数据库改变而触发OnChange事件,这个“一段时间”有长有短。从有效到无效的过程,程序不会有任何错误提示,就只是不能触发了。
于是查看了一下SQLServer日志,发现有重复的两个错误:
The query notification dialog on conversation handle '{B95987F3-A925-E811-BF09-F8BC12926344}.
' closed due to the following error: '
<?xml version="1.0"?>
<Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error">
<Code>-8490</Code>
<Description>Cannot find the remote service 'SqlQueryNotificationService-133aba61-6b63-4808-964f-aded417c518d' because it does not exist.</Description>
</Error>'

The query notification dialog on conversation handle '{0C0CFA69-7B23-E811-A9B6-F8BC12926344}.
' closed due to the following error: '
<?xml version="1.0"?>
<Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error">
<Code>-8470</Code>
<Description>Remote service has been dropped.</Description>
</Error>'.

还有一个出现过一次的错误:
Service Broker needs to access the master key in the database 'PrintedRecords'. Error code:26. The master key has to exist and the service master key encryption is required.

不了解SQLDependency类的内部实现,所以不知道原因。不知道有没有可能是网络不稳定导致的数据库连接断开导致的?如果是的话有没有好的解决办法?
...全文
895 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevenjin 2018-03-17
  • 打赏
  • 举报
回复
你换个简单的表监测一下,用正确的示例
stevenjin 2018-03-17
  • 打赏
  • 举报
回复
我最近也在做这个,出现同样问题。现在又正常了,你排除下是不是其他代码造成。
FainSheeg 2018-03-15
  • 打赏
  • 举报
回复
引用 4 楼 yangliu0512 的回复:
网上看到一篇相关的博客:http://blog.csdn.net/yuyang00000/article/details/37937847 对于第二条错误有了解释:大体意思就是程序调用Sqldependency.stop之后,sqlserver并不会取消已经订阅的查询通知(Stop之前肯定有过最后一次订阅),当数据库改变触发通知时,sqlserver试图向客户端发送通知,然而此时客户端已经Stop了,于是:Remote service has been dropped。 同理,网上有同学会出现日志飞涨的情况,则是因为客户端频繁的调用Sqldependency.stop的结果,基本上就是调用一次就会产生一条。 然而第一条错误还不知道什么原因。
又看了一遍,他妈的英文看得头疼,发现上面的有点错,Cannot find the remote service 'SqlQueryNotificationService-133aba61-6b63-4808-964f-aded417c518d' because it does not exist这个错误产生的原因才是上面的。很明显,不会导致失效。 而Remote service has been dropped,则可能是因为回调函数(即OnChange事件)执行时间太长,导致会话超时的原因,SQLserver会丢弃相应的消息队列及服务。默认的超时时间应该是30S吧。但是同样也提到当客户端执行完onchange后,重新订阅,会重新创建新的Service Broker服务和queue。也就是说不会导致失效。 第三条则是因为查询的数据表缺少主键的原因,sqldependency创建查询会话时,sqlserver会创建一个timer用于会话超时的计时,然而这个timer本身也需要一个会话才能存在,而这个timer会话在创建时并没有指定ENCRYPTION = OFF子句,所以它需要一个主键来存储会话密钥(用主键存储密钥,什么鬼),所以缺少主键会出错。但是这个会话本身却又不需要发送任何消息,所以这个密钥又是不必要的,所以这个错误除了产生一条错误日志之外,不会有任何其他后果。所以也不会导致失效 好吧,我还是没找到我这SQLDependency挂一段时间后失效的原因。
FainSheeg 2018-03-15
  • 打赏
  • 举报
回复
网上看到一篇相关的博客:http://blog.csdn.net/yuyang00000/article/details/37937847 对于第二条错误有了解释:大体意思就是程序调用Sqldependency.stop之后,sqlserver并不会取消已经订阅的查询通知(Stop之前肯定有过最后一次订阅),当数据库改变触发通知时,sqlserver试图向客户端发送通知,然而此时客户端已经Stop了,于是:Remote service has been dropped。 同理,网上有同学会出现日志飞涨的情况,则是因为客户端频繁的调用Sqldependency.stop的结果,基本上就是调用一次就会产生一条。 然而第一条错误还不知道什么原因。
FainSheeg 2018-03-14
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
可能是你没有读空上一次变化时的记录引起的
没明白这一句是啥意思?我执行command用的是excutenonerequiry。
xuzuning 2018-03-13
  • 打赏
  • 举报
回复
8490 要求对 PDC FSMO 的专门访问权的另一个操作正在进行中。 Cannot find the remote service 找不到远程服务 Service Broker needs to access the master key in the database 'Printed Records'. Error code:26. The master key has to exist and the service master key encryption is required. 服务代理需要访问数据库“打印记录”中的主密钥。错误代码:26。主密钥必须存在,并且需要服务主密钥加密。 可能是你没有读空上一次变化时的记录引起的
FainSheeg 2018-03-13
  • 打赏
  • 举报
回复
没人碰到过类似问题吗?

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧