Sql server 我希望我的数据库(SQL)通知或将更新推送到客户端应用程序

Sql server 我希望我的数据库(SQL)通知或将更新推送到客户端应用程序,sql-server,push-notification,service-broker,sqldependency,query-notifications,Sql Server,Push Notification,Service Broker,Sqldependency,Query Notifications,我是在VB.net 2010和sql2008上开发这个应用程序的 我希望通知客户机数据库的更新,并且应用程序使用计时器在指定的分钟内检查数据库的更改,这确实是不高效的。我读过关于查询通知,sqldependency,service broker,但后来我读到一篇文章说,如果我有100个客户端,并且我正在使用查询通知将通知推送到我的应用程序,那么它们可能效率不高。 是否有人会帮助我做什么,以及我如何做(如果有例子的话,会很有帮助)。提前谢谢 查询通知将推送到Service Broker服务,而不是

我是在
VB.net 2010
sql2008
上开发这个应用程序的
我希望通知客户机数据库的更新,并且应用程序使用计时器在指定的分钟内检查数据库的更改,这确实是不高效的。我读过关于
查询通知
sqldependency
service broker
,但后来我读到一篇文章说,如果我有100个客户端,并且我正在使用查询通知将通知推送到我的应用程序,那么它们可能效率不高。

是否有人会帮助我做什么,以及我如何做(如果有例子的话,会很有帮助)。提前谢谢

查询通知将推送到Service Broker服务,而不是直接推送到应用程序。查看以了解其工作原理。您的应用程序正在通过在数据库上发布语句来等待通知。这意味着100个客户端中的每一个都占用一个SQL Server工作线程(这是有限的,请参阅选项)。我已经在+1000个客户端的生产环境中看到了这一点(在增加了max-worker-threads选项之后),但我建议不要这样做

我的建议是使用SqlDependency/QueryNotifications为变更提供一个服务监控。然后,该服务将使用WCF将通知推送到所有正在运行的应用程序。您将订阅一般更改(
表Foo已更改
),而不是特定更改(
表Foo中的x行已插入

一般来说,SqlDependency/Query通知只能通知您数据已更改,但不会推送新数据。一旦收到通知,应用程序必须通过再次运行查询来刷新其本地数据集。

使用类时要小心-它具有内存泄漏的漏洞。您可以使用SqlDependency类的开源实现-。它使用数据库触发器和本机ServiceBroker通知来接收有关表更改的事件。这是一个使用示例:

int changesReceived=0;
使用(SqlDependencyEx SqlDependencyEx=new SqlDependencyEx(
测试\连接\字符串、测试\数据库\名称、测试\表\名称)
{
sqlDependency.TableChanged+=(o,e)=>changesReceived++;
sqlDependency.Start();
//更改表格。
MakeTableInsertDeleteChanges(changesCount);
//请稍等,以接收所有更改。
睡眠(1000);
}
断言.AreEqual(changesCount,changesReceived);

使用SqlDependecyEx,您可以只监视更新,避免删除和插入。希望这能有所帮助。

如果您不手动更新数据库,并且所有数据操作都在应用程序中,那么您应该在应用程序服务层或业务层而不是数据库中检测更改,以防依赖数据库技术而难以访问其他数据库。 另一方面,若您对数据库进行了手动更新,或者对数据库的依赖性并不重要,那个么您可以使用CDC(通道数据捕获)将更改推送到service broker,并将您的应用程序从service broker中弹出更改,然后通过与Signal相同的双向http通信技术将它们发送到客户端