Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Sql依赖项的查询通知-停止检测更改_C#_Sql Server_Service Broker_Sqldependency_Query Notifications - Fatal编程技术网

C# 使用Sql依赖项的查询通知-停止检测更改

C# 使用Sql依赖项的查询通知-停止检测更改,c#,sql-server,service-broker,sqldependency,query-notifications,C#,Sql Server,Service Broker,Sqldependency,Query Notifications,我正在使用SQL server表作为应用程序中的队列。我使用SQL依赖关系使用查询通知,特别是Jeremiah Gowdy在本文中使用的很棒的实现 我在Windows服务中实现了这一点,并使用它“侦听”SQL表(即我的队列)上的更改,如果有更改,则对队列返回的内容进行处理-请参阅下面的代码,返回存储过程内容的数据集 问题是,在重载或一段时间后,即使表中存在记录,也无法再检测到更改。当我重新启动服务时,就会检测到更改!我试图手动更新表格,以触发通知,但没有效果。通知服务似乎在某个时候中断,无法重新

我正在使用SQL server表作为应用程序中的队列。我使用SQL依赖关系使用查询通知,特别是Jeremiah Gowdy在本文中使用的很棒的实现

我在Windows服务中实现了这一点,并使用它“侦听”SQL表(即我的队列)上的更改,如果有更改,则对队列返回的内容进行处理-请参阅下面的代码,返回存储过程内容的数据集

问题是,在重载或一段时间后,即使表中存在记录,也无法再检测到更改。当我重新启动服务时,就会检测到更改!我试图手动更新表格,以触发通知,但没有效果。通知服务似乎在某个时候中断,无法重新订阅,但我不能确定

我拼命地想找到一个解决这个问题的方法,因为我必须不断地观察表本身的变化,如果队列卡住了,就重新启动服务——这不理想

是否有其他人对SQL依赖关系和查询通知有任何问题?尤其是任何关于知识问题的指导或知识都会有所帮助。我知道存在更好的排队系统,但如果可以的话,我想解决这个问题,而不是重新开发整个项目

下面是一段代码片段

//Initialisation
public void StartWatcher()
{
    SqlCommand cmd = new SqlCommand();
    cmd = new SqlCommand("TransferExportQueue");
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    log.Info("Setting up SQL Watcher");
    //Setup the SQLWatcher
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.ConnectionString = ConfigurationManager.ConnectionStrings["Connexion"].ConnectionString;

    log.Info("Attempting to Start");
    SqlQueueWatcher = new SqlWatcher(builder.ConnectionString, cmd, SqlWatcher.SqlWatcherNotificationType.Blocking);
    SqlQueueWatcher.OnChange += new SqlWatcher.SqlWatcherEventHandler(QueueSQLWatcher_OnChange);
    SqlQueueWatcher.Start();

}

//OnChangeEvent
private void QueueSQLWatcher_OnChange(DataSet Result)
{
    //perform logic in returned contents of stored procedure
}
这是我的存储过程

Create PROCEDURE [dbo].[TransferExportQueue] 
AS
BEGIN

SELECT [Id]
      ,[TransactionLogId]
      ,[QueueDate]
      ,[UpdateTable]
FROM [dbo].[TransferExportQueue]



END
更新: 我有一个sql server日志,我得到以下错误

The query notification dialog on conversation handle '{9586CB6A-62BA-E311-983B-A0369F0A65D3}.' 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>'.
远程服务似乎一直在下降,在进一步挖掘之后,它似乎与SQLDependency在每次调用后如何清理订阅有关。有人知道如何解决这个问题吗?

阅读本文:。其要点是,你的应用程序有一个有限的时间来处理OnChange回调,否则激活的过程计时器将启动并终止服务,破坏你的应用程序。就我个人而言,我并不喜欢这个设计,但事实就是如此

欢迎加入我们的俱乐部,他们不得不放弃方便的使用,使用即时部署的基础设施,使用更基本的类,这要求您显式部署目标服务/队列。您在易用性方面失去了什么,您将获得对行为的控制,如果您最终从正在运行的应用程序下面删除了目标服务,至少您只能怪自己;)


不过说真的,从SqlDependency切换到SqlNotificationRequest相当容易,我建议您这样做。

您只有一次初始化吗?如果不是,那么有多少个?您是指“SqlQueueWatcher”实例?我有一个包含SqlQueueWatcher基本代码的公共类,我的解决方案中的其他几个项目就是从这个类实例化的(大约8个项目)。如果初始化的实例数不超过DBYM中的池连接数,我会检查,但是,如果池连接不足,是否应该抛出错误?不能抛出错误。试着像这样检查池连接[谢谢Remus,我刚刚阅读了你关于我的确切问题的帖子!所以没有办法解决这个问题?问题是应用程序是实时部署的,而这个问题只是在负载测试下才出现的!如果没有,我有一些编码要做…我能说的就是享受你的编码:(如果还没有现场事件,您将有时间进行适当的设计。谢谢Remus,是的,恐怕是现场事件。战地站。您有任何关于如何实现SqlNOtificationRequest的好例子吗,似乎很少!我在这里看过了,但它的bug似乎没有按预期工作。您有什么资源可以指给我吗?@RemusRusanu感谢您的回答。那么您是说如果您使用SqlDependency,那么它将负责管理后台的所有ServiceBroker内容吗?谢谢