gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:47 26 4
gpt4 key购买 nike

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

我在 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 如何在每次调用后清理订阅有关。有谁知道如何解决这个问题?

最佳答案

阅读这篇文章:SqlDependency.OnChange callback timing .其要点是您的应用程序处理 OnChange 回调的时间有限,否则激活的过程计时器将启动并终止服务,从而对您的应用程序造成严重破坏。就我个人而言,我不是设计的粉丝,但它就是这样。

欢迎来到不得不放弃手边的人的俱乐部SqlDependency使用,它是即时部署的基础设施,并使用更基本的 SqlNotificationRequest类,这需要您显式部署目标服务/队列。您在易用性方面失去了什么,您将获得对行为的控制,如果您最终从您正在运行的应用程序中删除目标服务,至少您只能怪自己 ;)

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

关于c# - 使用 Sql 依赖项的查询通知 - 停止检测更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22784955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com