【问题标题】:I want my database (SQL) to notify or push updates to client application我希望我的数据库 (SQL) 通知或推送更新到客户端应用程序
【发布时间】:2013-01-30 07:02:51
【问题描述】:
我在VB.net 2010 和SQL 2008 上开发此应用程序。
我希望客户端收到有关数据库更新的通知,并且应用程序用于使用计时器检查数据库在指定分钟内的更改,这确实效率不高。我读到了query notification、sqldependency、service broker,但后来我读到一些内容,说如果我有 100 个客户端并且我正在使用查询通知将通知推送到我的应用程序,它们可能效率不高。
有人会帮助我应该做什么,以及我该怎么做(如果有示例,那将非常有帮助)。提前致谢!
【问题讨论】:
标签:
sql-server
push-notification
service-broker
sqldependency
query-notifications
【解决方案1】:
查询通知将推送到 Service Broker 服务,而不是直接推送到您的应用程序。请参阅The Mysterious Notification 以了解其工作原理。您的应用程序正在等待通过在数据库中发布WAITFOR(RECEIVE) 语句 的通知。这意味着 100 个客户端中的每一个都占用一个 SQL Server 工作线程(这是有限的,请参阅max worker threads 选项)。我已经看到这在生产中与 +1000 个客户端一起工作(在提高了最大工作线程选项之后),但我建议反对它。
我的建议是使用 SqlDependency/QueryNotifications 对更改进行 一个 服务监控。然后,该服务将使用 WCF 将通知推送到所有正在运行的应用程序。您将订阅通用更改 (the table Foo was changed),而不是特定更改 (the row x in table Foo was inserted)。
作为一般规则,SqlDependency/Query Notifications 只能通知您数据已更改,但不会推送 新 数据。一旦收到通知,应用程序必须通过再次运行查询来刷新其本地数据集。
【解决方案2】:
小心使用 SqlDependency 类 - 它的 problems 存在内存泄漏。但是,您可以使用 SqlDependency 类的开源实现 - SqlDependencyEx。它使用数据库触发器和本机 Service Broker 通知来接收有关表更改的事件。这是一个用法示例:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
使用 SqlDependecyEx,您可以只监控 UPDATE,避免 DELETE 和 INSERT。希望这会有所帮助。
【解决方案3】:
如果你不手动更新数据库,所有数据操作都在你的应用程序中,你应该检测应用程序服务层或业务层而不是db的变化,以防你依赖数据库技术,去其他数据库会很困难.
另一方面,如果您对 db 进行手动更新或对 db 的依赖并不重要,您可以使用 CDC(chane 数据捕获)并将更改推送到服务代理,然后您的应用程序从服务代理弹出更改,然后通过双向 http 通信技术将它们发送到客户端与 SignalR 相同。