2009-05-18 52 views
35

我有一個由數據庫和多個服務組成的應用程序。其中一項服務向數據庫添加信息(由用戶觸發)。用Sql Server 2008更改通知

另一項服務會定期查詢數據庫中的更改,並將新數據用作處理的輸入。

到現在爲止,我使用了一個可配置的計時器,每隔30秒左右查詢數據庫。我閱讀了關於更改通知的Sql 2005。但是,在Sql 2008中,此功能已被棄用。

在代碼中直接獲取數據庫中發生的更改的最佳方式是什麼?什麼是最佳實踐?

回答

3

是的,this blog post解釋Notification Services現在已被棄用,以及未來的替代品或替代品是什麼。

出於您的目的 - 獲取數據庫中發生的更改的通知 - 這聽起來像是您想要的SQL Server Change Tracking。但通知是一個拉模型 - 您的應用程序必須在更改表上執行查詢。

我無法弄清SqlDependency是否繼續使用Notification Services不建議使用。

+0

SqlDependency現在使用「Service Broker」 – lehn0058 2013-03-21 16:32:27

3

有很多不同的方法可以跟蹤數據庫中的變化:通過維護時間結構的觸發器,例如積壓,跟蹤日誌(又名'審計表')或使用SQL 2008中的變更跟蹤工具作爲參考在另一個答案。不管你使用什麼機制,你都有通知你的本地服務這個變化的問題。爲此,您可以使用Service Broker和基於事件的激活。從你描述的內容來看,似乎讓應用程序等待隊列中的事件。 http://msdn.microsoft.com/en-us/library/ms171581.aspx

如果您不希望讓服務停留在隊列中,您可以通過使用服務代理中的外部激活機制來調查服務啓動爲「按需」生活。

2

您可以使用System.Data.SqlClient.SqlDependency(適用於Service Broker)訂閱表中的更改。

18

Notification Services已被棄用,但您不想使用它。

在某些情況下,您可能會考慮Service Broker消息;細節取決於你的應用程序。

在大多數情況下,您可以使用SqlDependency或SqlCacheDependency。他們的工作方式是當你發出一個包含你的查詢的SqlDependency對象時。查詢可以是單個SELECT或存儲過程中的一組複雜命令。

過了一段時間,如果另一個Web服務器或用戶或網頁對數據庫進行更改(可能導致上一個查詢的結果發生更改),則SQL Server將向所有已註冊SqlDependency對象的服務器發送通知。您可以註冊代碼以在這些事件到達時運行,或者事件可以簡單地清除緩存中的條目。

雖然您需要啓用Service Broker以使用SqlDependency,但您不需要明確地與它進行交互。但是,您也可以將其用作替代機制;把它看作一個持久的消息系統,保證消息順序和一次性交付。

有關如何使用這些系統的詳細信息,對於論壇帖子有點長。您可以爲他們提供Google,也可以在我的書中提供示例(Ultra-Fast ASP.NET)。

+0

在你的回答中,你說SQL Server會向所有註冊了SqlDependency的_servers_發送一個通知。這個相同的想法是否會起作用,併成爲通知桌面應用程序用戶的一個很好的解決方案? – 2012-02-28 16:58:27