【问题标题】:Change Notification with Sql Server 2008使用 Sql Server 2008 更改通知
【发布时间】:2010-10-27 00:15:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql-server sql-server-2008 notifications


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 在您的回答中,您说 SQL Server 将向所有已注册 SqlDependency 的 服务器 发送通知。同样的想法是否可行,并且是通知用户桌面应用程序的良好解决方案?
      • 我说“服务器”主要是因为这就是该功能的正常使用方式。但是,它也可以用于通知客户端,假设客户端已经在直接访问数据库 - 例如,它不适用于 Web 客户端。每个挂起的 SqlDependency 也有(小)成本,所以它也只在客户端数量相对较少(比如大约 1000 个左右)的环境中才有意义。
      • 没有硬性限制。出于性能原因,我建议将 1000 个连接作为粗略的最大值。确切的数字会有所不同,具体取决于您的性能要求和期望、有多少查询具有依赖关系、查询的复杂性等等。
      • SqlDependency 不依赖于docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… 中提到的查询通知,还是将其抽象出来并为更高版本的 SQL Server 使用不同的机制?
      • 是的,SqlDependency 依赖于查询通知。但是,查询通知与通知服务不同。在幕后,它使用 Service Broker。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        是的,this blog post 解释说通知服务现已弃用,以及未来的替代品或替代品是什么。

        出于您的目的 - 收到有关数据库中发生更改的通知 - 听起来您想要SQL Server Change Tracking。但是通知是一个拉模型 - 你的应用程序必须对更改表进行查询。

        我无法确定 SqlDependency 是否可以继续使用已弃用的通知服务。

        【讨论】:

        • SqlDependency 现在在“Service Broker”之外运行
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多