2012-09-17 462 views
37

我目前的情況是,我有一個應用程序需要在新數據到達數據庫表時通知。數據來自外部來源(我無法控制 - 這是唯一的集成選項)。當新數據到達時,我的應用程序需要採取某些行動 - 基本上查詢新數據,處理它,將結果插入本地表中等。SqlDependency可靠性?

如果可能,我想避免輪詢,因爲數據是預計將實時處理。這就是說,確保沒有數據錯過是首要任務。

我的問題:

  1. 是的SqlDependency通常被認爲是可靠的?
  2. 我是否需要關注比賽條件,例如當另一個人到達時,我正在處理一個變化?
  3. 數據庫重新啓動時會發生什麼?我的應用程序是否會恢復並重新開始接收更改,或者是否需要某種會定期重新訂閱通知的故障安全計時器?
  4. 我已閱讀的主題地址中的大部分文章都是針對SQL Server 2005的。我正在使用SQL Server 2008 R2。是否有一種比SqlDependency更受歡迎的新技術?
  5. (編輯)另外,如果應用程序停機怎麼辦?我想我將不得不查詢啓動時丟失的數據?
+0

當您說您的應用程序需要執行數據庫操作時,db是否可以僅執行這些操作? – Kermit

回答

52

1)是的,我認爲這是可靠的,在它正確的目的是爲了做(緩存失效)

2)號這就是爲什麼你只能通過發出一個查詢認購,這確保數據獲取和新更新之間沒有競爭通知

3)數據庫(或實例)重新啓動信號的所有待處理查詢通知的SqlNotificationInfo值爲Restart。請閱讀SqlDependency and is based on Query Notification以獲得更好的理解。作爲SqlDependency保持一個開放連接到數據庫的時候,數據庫的可用性將被SqlDependency即使任何明確的查詢通知

4)在此進一步下跌更多號之前檢測...

5)沒有'錯過的數據'。查詢通知(因此SqlDependency)從未通知您什麼數據改變。它只是通知你,它改變了。你總是應該回去看全部回數據回 看看發生了什麼變化(我將你引回問題/答案2)。新開始的應用程序尚未查詢數據,因此沒有任何更改需要通知。只有之後它首先查詢了數據是否可以收到通知。

從你的問題描述我不相信你需要查詢通知。在我看來,即使您的應用程序沒有運行,您也想要對任何更改採取行動,無論發生何時發生,。這肯定不是緩存失效,它是更改跟蹤。因此,您需要部署一個更改跟蹤技術,如Change Data CaptureChange Tracking,這兩者都是SQL Server 2008及更高版本(不適用於SQL Server 2005)。使用SQL Server 2005部署觸發器並排隊消息Service Broker以處理您嘗試處理的相同問題(檢測更改,對每行新數據作出反應)並不罕見。

+0

關於您的最後一點,當應用程序啓動時,它將查詢所有數據以查看尚未處理的內容 - 與收到通知時相同。我認爲我的問題的措辭可能沒有誤導 - 我認爲我需要解決的問題與緩存相同,即使它與緩存無關。也就是說,我會閱讀你提供的所有鏈接,並重新考慮我的方法。謝謝你的出色答案。 –

+0

@Remus Rusanu,我閱讀了您的精彩博客文章,但是如果「當SQL Server 2005重新啓動時,所有查詢通知訂閱都會得到通知並結束,它甚至會對緩存失效有用」。看起來,如果服務器控制訂閱期限,那麼無法保證緩存一致性?我的用例是刷新彈性搜索索引。 –

+1

@JohnZabroski服務器無法保證實例脫機時沒有數據發生更改。例如,管理員可能已經複製並替換了數據庫文件。我建議你問一個單獨的問題。 –

4

即將它從視圖只是想使用它的緩存失效,它一直是真正的痛苦,而不是完全可靠的.NET開發人員的點。

設置和故障診斷一直都特別痛苦,我們得到它的工作好了一個環境,但隨後它並沒有在其他工作。搞清楚爲什麼困難和耗時。

即使全部運行,它也不是完全可靠的。如果SQL Server在負載較重的情況下可以刪除通知,並且存在重新啓動和通知不恢復的已知問題:http://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql-server-restarts

如果有替代技術,你想要做什麼,少麻煩我會避免。

+1

如果說如果存在的話使用替代方法會更好嗎?你知道另一個選擇嗎? – Noctis

+0

可能有點晚,但您可以嘗試https://github.com/dyatchenko/ServiceBrokerListener/issues – Choco