Hy guys,從數據庫通知而不是輪詢。可能嗎?
監視db上的指定表我每隔幾毫秒(10-20毫秒)就輪詢一次這個表。
有沒有機會有一個通知(避免SqlDependency,在我的情況是太慢),而不是輪詢?
你有什麼想法嗎?
我的場景是.net + Sql Server 2008
謝謝!
Hy guys,從數據庫通知而不是輪詢。可能嗎?
監視db上的指定表我每隔幾毫秒(10-20毫秒)就輪詢一次這個表。
有沒有機會有一個通知(避免SqlDependency,在我的情況是太慢),而不是輪詢?
你有什麼想法嗎?
我的場景是.net + Sql Server 2008
謝謝!
您可以使用SqlChangeMonitor class,但在緩存的數據場景中包含SqlDependency。不過,你的問題有點含糊不清,你爲什麼想這樣做。
我需要此輪詢以快速知道盡可能將數據存儲在數據庫中以將此消息重定向到另一個系統。在我的情況下,我必須快速 – ff8mania
呼叫應用程序是否可以改爲寫入queue?
如果不是,我猜數據庫上的觸發器調用CLR Stored Procedure?這可能會引發任何所需的事件。
是的,我也可以更改應用程序。但是,你的隊列意味着什麼?一旦我在這個隊列中有消息,如何通知我的應用程序一個新數據已準備好被獲取? – ff8mania
http://en.wikipedia.org/wiki/Message_queue –
它可以使用CLR存儲過程來調用WCF /或web服務。這不是一件非常困難的事情。
這實際上需要2個步驟。
修改數據。 修改完數據後,您必須將數據發送到clr存儲過程。最簡單的方法是寫入一個或多個臨時表。
clr存儲過程。 在CLR存儲過程將連接到數據庫與
「上下文連接=真正的」
,這樣你將有機會獲得您所需要的存儲過程。加載數據後,將其發送到服務器(WCF/webservice)。在CLR中,您只需添加所需的服務引用即可。同時在服務器上,你必須註冊某些DLL服務器的使用方法:
system.web
smdiagnostics
system.runtime.serialization
system.identitymodel
system.identitymodel.selectors
system.messagng
system.transactions.bridge
system.servicemodel
其他的都是普通的.NET代碼來調用WCF/Web服務。 這種方法非常快速且非常可靠。
可行,但我希望有更多的事件導向,如果可能 – ff8mania
更多面向事件?你什麼意思 ?當我需要對數據庫中的更改進行即時通知時,這是我使用的。這些更改已完成至多30個表格,並且應用程序會收到所發生的一切通知。此外,在這種情況下,通知多個服務,這取決於數據的變化..我不知道有任何其他更快的通知方法。 –
作爲一個方面說明,這取決於您的複雜程度。這只是一個開始的框架。爲了確保消息的正確順序,我爲每個服務使用了隊列線程通知,以防萬一此通知速度如此之快(10-20ms非常快) –
我看到你說你需要通知(而SqlDependency
可用),但也許你不需要即時通知,並定期有效地閱讀更改將完成任務。如果是這樣,請轉至Google Change Data Capture
和Change Tracking
。
不幸的是,我需要即時(或幾乎istant,我可以「等待」不超過十幾毫秒) – ff8mania
10-20ms是很多投票。 – Paparazzi
@Blam我知道,這就是爲什麼我想改變我的方法 – ff8mania
只是想驗證。 SqlChangeMonitor類可能不那麼快。數據更新來自哪裏?您是否擁有數據庫服務器的控制權?例如。你可以添加存儲過程,觸發器,clr嗎? – Paparazzi