使用Sql依赖关系的查询通知 - 停止检测更改

时间:2014-04-01 11:47:37

标签: c# sql-server service-broker sqldependency query-notifications

我正在使用SQL服务器表充当我的应用程序中的队列。我正在使用SQL Dependency的查询通知,特别是Jeremiah Gowdy在这篇博客文章中使用的很棒的实现。 http://jgowdy.blogspot.com/2010/01/sqldependency-query-notification-with.html

我在Windows服务中实现这一点并将其用于" listen"更改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如何在每次调用后清理订阅有关。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

阅读这篇文章:SqlDependency.OnChange callback timing。它的要点是你的应用程序有一个有限的时间来处理OnChange回调或激活的程序计时器将启动并终止服务,破坏你的应用程序的破坏。就个人而言,我不是设计的粉丝,但它确实如此。

欢迎来到那些不得不放弃方便SqlDependency使用的人们的俱乐部,使用它的即时部署基础架构,并使用更基本的SqlNotificationRequest类,这需要您明确部署目标服务/队列。你在易用性方面放松了什么,你将获得对行为的控制权,如果你最终从正在运行的应用程序中删除目标服务,至少你只能责怪自己;)

说真的,从SqlDependency切换到SqlNotificationRequest相当容易,我推荐它。