SQL Server 2008中的更改通知

36

我有一个由数据库和多个服务组成的应用程序。其中一个服务会将信息添加到数据库中(由用户触发)。

另一个服务会定期查询数据库中的更改,并将新数据用作处理输入。

目前,我使用可配置的定时器大约每30秒查询一次数据库。我了解到Sql 2005具有更改通知功能。然而,在Sql 2008中,此功能已被弃用。

在代码中直接得到有关数据库更改的通知的最佳方法是什么?有哪些最佳实践?

4个回答

18

通知服务已被弃用,但你也不需要使用它。

在某些情况下,您可以考虑使用Service Broker消息;具体细节取决于您的应用程序。

在大多数情况下,您可能可以使用SqlDependency或SqlCacheDependency。它们的工作方式是:当您发出查询时,将SqlDependency对象与查询一起包含。查询可以是单个SELECT语句或存储过程中的复杂命令组。

稍后,如果另一个Web服务器、用户或Web页面对数据库进行更改,可能会导致上一个查询的结果发生变化,则SQL Server将向所有注册了SqlDependency对象的服务器发送通知。您可以注册代码以在这些事件到达时运行,或者该事件只能清除缓存中的条目。

虽然您需要启用Service Broker才能使用SqlDependency,但您不需要显式地与其交互。但是,您也可以将其用作替代机制;将其视为一种保证消息顺序和单次传递的持久性消息系统。

如何使用这些系统的详细信息有点长,无法在论坛帖子中提供。您可以通过Google搜索,或者我在我的书中提供了示例(Ultra-Fast ASP.NET)。


在你的回答中,你说SQL Server会向所有已注册SqlDependency的服务器发送通知。这个想法是否适用于通知桌面应用程序的用户?它是否是一个好的解决方案? - Ivy
我之所以说“服务器”,主要是因为该功能通常是这样使用的。然而,它也可以用于通知客户端,前提是客户端已经直接访问DB--所以对于Web客户端来说这是不可行的。每个未决的SqlDependency也有一定的成本,因此它只适用于相对较少的客户端环境(比如说大约在1000以下)。 - RickNZ
没有硬性限制。出于性能原因,我建议将最大连接数设置为1000个左右。确切的数字会有所不同,这取决于您的性能要求和期望、有多少查询具有依赖关系、查询的复杂度等因素。 - RickNZ
SqlDependency是否依赖于查询通知,正如https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/query-notifications-in-sql-server中所提到的那样,还是将其抽象化并在SQL Server的后续版本中使用不同的机制? - axk
是的,SqlDependency依赖于查询通知。但是,查询通知并不等同于通知服务。在底层,它使用Service Broker。 - RickNZ

3
在数据库中跟踪更改的方法有多种:通过维护时间结构,如待办事项、跟踪日志(也称为“审计表”)或使用SQL 2008中的更改跟踪功能作为另一个答案中的参考,都可以实现。无论使用哪种机制,你都需要解决通知自定义服务变化的问题。为此,可以使用Service Broker和基于事件的激活。根据你所描述的情况,似乎应用程序在队列上等待事件是可行的。
如果你不想让服务挂起并在队列上睡眠,可以研究使用服务代理中的外部激活机制来“按需”启动服务。 http://msdn.microsoft.com/en-us/library/ms171581.aspx

3
是的,这篇博客文章解释了通知服务现已被弃用,并提供了替代方案。对于你的目的 - 接收数据库中发生的更改通知 - 似乎你需要SQL Server更改跟踪。但是通知采用拉模型 - 应用程序必须在更改表上执行查询。我无法确定SqlDependency是否继续与已弃用的通知服务一起使用。

SqlDependency 现在基于 "Service Broker" 运行。 - lehn0058

2
您可以使用System.Data.SqlClient.SqlDependency(它与Service Broker一起工作)来订阅表中的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接