我让这段代码完美地工作了一年多,但最近它变得不一致了。
我正在使用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
。参数。
现在我还不知道还有什么可以让事情像过去一样运作。应用程序代码没有改变,现在之前工作的环境也没有改变。有什么可能导致这个问题的想法?
答案 0 :(得分:0)
看起来您的代码会立即关闭连接?
来自文档:
“依赖基础结构依赖于SqlConnection 调用Start时打开,以便接收通知 对于给定的命令“
,基础数据已更改
现在,连接将被合并,所以也许之前,即使您已经处理了对象,您的连接仍然保持打开状态?或者你的竞争状况恰好对你有利?
为什么不在应用程序期间保持连接打开,而不是在调用通知时重新订阅?