我正在使用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如何在每次调用后清理订阅有关。有谁知道如何解决这个问题?
答案 0 :(得分:2)
阅读这篇文章:SqlDependency.OnChange callback timing。它的要点是你的应用程序有一个有限的时间来处理OnChange回调或激活的程序计时器将启动并终止服务,破坏你的应用程序的破坏。就个人而言,我不是设计的粉丝,但它确实如此。
欢迎来到那些不得不放弃方便SqlDependency
使用的人们的俱乐部,使用它的即时部署基础架构,并使用更基本的SqlNotificationRequest
类,这需要您明确部署目标服务/队列。你在易用性方面放松了什么,你将获得对行为的控制权,如果你最终从正在运行的应用程序中删除目标服务,至少你只能责怪自己;)
说真的,从SqlDependency切换到SqlNotificationRequest相当容易,我推荐它。