我目前的情况是,我有一个应用程序,当新的数据到达数据库表时需要通知。 数据来自外部来源(我无法控制 – 这是唯一的集成选项)。 当新的数据到达时,我的应用程序需要采取某些行动 – 基本上查询新的数据,处理它,将结果插入本地表等。 我希望尽可能避免轮询,因为数据可望实时处理。 这就是说,确保没有数据被忽略是首要任务。 我的问题: SqlDependency通常被认为是可靠的吗? 我是否需要关注竞争条件,例如,当另一个人到达时,我正在处理一个变化? 数据库重新启动时会发生什么? 我的应用程序是否会恢复并重新开始接收更改,或者是否需要某种会定期重新订阅通知的故障安全计时器? 我已阅读的主题地址的大部分文章地址SQL Server 2005.我正在使用SQL Server 2008 R2。 有一种比SqlDependency更受欢迎的新技术吗? (编辑)另外,如果应用程序停机怎么办? 我想我将不得不查询启动时错过的数据?
我一直在.NET 3.5应用程序中使用SqlDependency超过3年没有任何问题。 情况如下: 用SqlDependency观察一个表的中央窗口服务(让我们称之为表A) 多个用户使用WPF应用程序和每个用户观看一个表的唯一SqlDependency (表A再次) 用户在表A中排队处理一个工作单元 SqlDependency触发Windows服务 Windows服务处理表A中的所有未完成项目,并将结果保存到表A中 唯一的SqlDependency触发结果可用的每个用户 用户处理他们的工作 最近,我将系统升级到了.NET 4.5,并开始发现将更改放入正在监视的表中的问题,但SqlDependency永远不会触发(在服务和用户应用程序中)。 我开始进一步深入研究,并在日志中注意到,在某些时候,我将重新注册SqlDependency ,但是之后通知将永远不会触发。 看到这个行为之后,我决定运行SQL服务器上的分析器来捕获订阅事件。 从捕获的数据中,我注意到有时订阅将被一个用户注册(具有唯一的ID),但是然后它将被另一个用户触发(具有相同的唯一ID)。 这通常发生在我上面提到的服务以及WPF应用程序的一个或多个用户。 (我已经在探查器结果中附加了问题的截图) 这是预期的行为? 是否可以为不同的用户发起通知? 这是否指向应用程序层中的问题? 任何帮助表示赞赏。
我正在使用一个表作为消息队列,并通过使用SqlDependency“注册”了更新。 我读到的每个人都在说要注意它的局限性,而不是特别说明它们是什么。 从我收集的信息来看,当桌子的更新频率非常高时,会有问题,幸运的是我只能看到每分钟最多10-20个值。 SqlServer的其他限制/影响是什么?
如何清理SQL Server以摆脱过期的SqlDependency对象? 在从SqlDepedency对象接收到事件后,我需要创build一个新的事件,然后才能获取新事件。 但是,SQL Server进程的内存使用会一直攀升,直到超出允许的内存(SQL Server Express)。 我如何摆脱旧的查询? 码: // Func: RegisterTableListener using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.DatabseEventConnectionString)) { if (cmd == null) { cmd = cn.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT HostName, LastStatus, LastDetails, xml FROM dbo.[SystemTable]"; } lock (cmd) { cmd.Connection = cn; cn.Open(); cmd.Notification = null; // creates a new dependency […]