从服务代理到SQL依赖的调用不一致

时间:2017-11-24 13:25:01

标签: c# sql-server asp.net-mvc service-broker sqldependency

我让这段代码完美地工作了一年多,但最近它变得不一致了。

我正在使用SqlDependecy功能订阅我的SQL Server数据库的查询,该数据库应该通知我的更改。

我的代码正常呼叫

SqlDependency.Start(ConfigurationManager.ConnectionStrings["cs"].ConnectionString)

在系统的Application_start()上,订阅

等查询
using (var connection = new SqlConnection(connString))
            {
                connection.Open();
                using (var command = new SqlCommand("valid sql query for sqldependecy", connection))
                {
                    command.Notification = null;
                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    using (SqlDataReader reader = command.ExecuteReader()) { }
                }
            }

并在每次OnChange调用后重新订阅。但最近Service Broker停止通知我的应用程序查询有变化。有时它会起作用,就像我第一次在当天尝试它一样,但在那之后,即使我重新启动应用程序,OnChange也不再被调用。在本地和生产服务器中以调试模式运行的应用程序也会出现此问题。

我尝试根据我在微软网站上发现的一些令人困惑的指令在Service Broker上创建一个新队列,类似

CREATE QUEUE queuetest;  

CREATE SERVICE queuetestNotifications  
  ON QUEUE queuetest  
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

并在应用程序上使用此队列,调用方法以队列参数

开始
SqlDependency.Start(ConfigurationManager.ConnectionStrings["cs"].ConnectionString, "queuetest");  

起初,我得到了与没有这个的情况下使用SqlDependecy相同的行为,但是一段时间后,当尝试使用" queuetest"时,它开始抛出KeyNotFoundExceptions。参数。

现在我还不知道还有什么可以让事情像过去一样运作。应用程序代码没有改变,现在之前工作的环境也没有改变。有什么可能导致这个问题的想法?

1 个答案:

答案 0 :(得分:0)

看起来您的代码会立即关闭连接?

来自文档:

  

“依赖基础结构依赖于SqlConnection   调用Start时打开,以便接收通知   对于给定的命令“

,基础数据已更改

现在,连接将被合并,所以也许之前,即使您已经处理了对象,您的连接仍然保持打开状态?或者你的竞争状况恰好对你有利?

为什么不在应用程序期间保持连接打开,而不是在调用通知时重新订阅?