35

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

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

到目前为止,我使用了一个可配置的计时器,它每 30 秒左右查询一次数据库。我阅读了有关 Sql 2005 的更改通知功能。但是,在 Sql 2008 中,此功能已被弃用。

直接在代码中获得数据库中发生更改的通知的最佳方法是什么?最佳实践是什么?

4

4 回答 4

18

通知服务已被弃用,但无论如何您都不想使用它。

在某些情况下,您可能会考虑 Service Broker 消息;详细信息取决于您的应用程序。

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

稍后,如果另一个 Web 服务器或用户或网页对 DB 进行更改,可能导致先前查询的结果发生更改,则 SQL Server 将向所有已注册 SqlDependency 对象的服务器发送通知。您可以注册代码以在这些事件到达时运行,或者事件可以简单地清除缓存中的条目。

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

如何使用这些系统的细节对于论坛帖子来说有点长。您可以使用 Google 搜索它们,也可以在我的书中 ( Ultra-Fast ASP.NET ) 中提供示例。

于 2009-11-15T11:45:21.563 回答
3

是的,这篇博文解释了通知服务现在已被弃用,以及未来的替代品或替代品是什么。

出于您的目的 - 获取数据酶中发生的更改的通知 - 听起来您需要SQL Server 更改跟踪。但是通知是一个拉模型 - 你的应用程序必须对更改表进行查询。

我无法弄清楚 SqlDependency 是否继续与已弃用的通知服务一起工作。

于 2009-05-18T13:39:11.607 回答
3

有许多不同的方法可以跟踪数据库中的更改:要么通过维护时间结构的触发器,例如积压、跟踪日志(又名“审计表”),要么使用 SQL 2008 中的更改跟踪工具作为另一个答案中的参考。无论您使用何种机制,您都会遇到将更改通知您的本地服务的问题。为此,您可以使用 Service Broker 和基于事件的激活。根据您的描述,似乎让应用程序等待队列中的事件。 http://msdn.microsoft.com/en-us/library/ms171581.aspx

如果您不希望服务在队列中挂起并在队列中休眠,您可以通过使用服务代理中的外部激活机制来调查将服务“按需”激活。

于 2009-05-28T14:32:25.130 回答
2

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

于 2009-10-27T16:06:39.243 回答