使用Sql Server 2008更改通知
我有一个由数据库和多个服务组成的应用程序。 其中一个服务将信息添加到数据库(由用户触发)。
另一个服务定期查询数据库的变化,并使用新的数据作为input进行处理。
到现在为止,我使用了一个可configuration的计时器,每30秒左右查询数据库。 我阅读了关于更改通知的Sql 2005。 但是,在Sql 2008中,这个特性已经被弃用了。
直接在代码中获取数据库中发生的更改的最佳方式是什么? 什么是最佳实践?
Notification Services已被弃用,但您不想使用它。
在某些情况下,您可能会考虑Service Broker消息; 细节取决于你的应用程序。
在大多数情况下,您可以使用SqlDependency或SqlCacheDependency。 他们的工作方式是当你发出一个包含你的查询的SqlDependency对象时。 查询可以是单个SELECT或存储过程中复杂的一组命令。
过了一段时间,如果另一个Web服务器或用户或网页对数据库进行了更改(可能导致上一个查询的结果发生更改),则SQL Server将向所有已注册SqlDependency对象的服务器发送通知。 您可以注册代码以在这些事件到达时运行,或者事件可以简单地清除caching中的条目。
尽pipe您需要启用Service Broker来使用SqlDependency,但您不需要明确地与它进行交互。 但是,您也可以将其用作替代机制; 把它看作一个持久的消息系统,保证消息顺序和一次性交付。
如何使用这些系统的细节是一个论坛post有点长。 你可以selectGoogle,也可以在我的书( 超快速ASP.NET )中提供例子。
是的, 这个博客文章解释说Notification Services现在已经被弃用了,以及替代品或替代品是什么。
出于您的目的 – 获取数据库中发生的更改的通知 – 听起来像您想要SQL Server更改跟踪 。 但通知是一个拉模型 – 您的应用程序必须在更改表上执行查询。
我无法弄清楚SqlDependency是否继续与Notification Services一起使用。
有很多不同的方式来跟踪数据库中的变化:或者通过维护时间结构的触发器,如积压,跟踪日志(又名“审计表”),或者使用SQL 2008中的变更跟踪function作为另一个答案中的参考。 不pipe你使用什么机制,你都有通知你的本地服务的变化的问题。 为此,您可以使用Service Broker和基于事件的激活。 从你所描述的,似乎让应用程序等待队列中的事件。 http://msdn.microsoft.com/en-us/library/ms171581.aspx
如果你不希望有服务挂在队列上睡觉,你可以通过使用服务代理中的外部激活机制来调查服务,使之成为“按需”生活。
您可以使用System.Data.SqlClient.SqlDependency(适用于Service Broker)订阅表中的更改。