使數據庫服務器的所有客戶端保持同步的最佳策略是什麼?跨所有客戶端的數據庫數據的實時同步
該方案涉及數據庫服務器和連接到它的客戶端的動態數量,查看和修改數據。
我需要跨所有客戶端的數據實時同步 - 如果數據被添加,刪除或更新,我希望所有客戶端實時查看更改,而不會對數據庫引擎造成太大的壓力通過連續輪詢幾百萬行表格中的變化。
現在我正在使用Firebird數據庫服務器,但我願意爲這項工作採用最好的技術,所以我想知道是否有任何一種已經存在的此類場景的框架,哪些數據庫引擎它是否使用,它涉及什麼?
使數據庫服務器的所有客戶端保持同步的最佳策略是什麼?跨所有客戶端的數據庫數據的實時同步
該方案涉及數據庫服務器和連接到它的客戶端的動態數量,查看和修改數據。
我需要跨所有客戶端的數據實時同步 - 如果數據被添加,刪除或更新,我希望所有客戶端實時查看更改,而不會對數據庫引擎造成太大的壓力通過連續輪詢幾百萬行表格中的變化。
現在我正在使用Firebird數據庫服務器,但我願意爲這項工作採用最好的技術,所以我想知道是否有任何一種已經存在的此類場景的框架,哪些數據庫引擎它是否使用,它涉及什麼?
Firebird具有一個名爲EVENT
的功能,您可以使用該功能來通知客戶端數據庫的更改。這個想法是,當表中的數據發生變化時,觸發器會發佈一個事件。 Firebird負責通過名稱通知所有已註冊過該活動興趣的客戶。一旦通知,每個客戶端負責通過查詢數據庫來刷新自己的數據。
客戶端無法從事件中獲取有關新值或舊值的信息。這是設計的,因爲無法通過事務隔離來解決這個問題。您的客戶也不能使用通配符註冊事件。因此,您必須非常廣泛地設計您的服務器到客戶端通知,並讓客戶端進行更新以查看究竟發生了什麼變化。
見http://www.firebirdsql.org/doc/whitepapers/events_paper.pdf
你沒有提到你正在使用的客戶端平臺或語言,所以我不能對你會使用特定的API建議。我建議你谷歌例如「火鳥事件Java」或「火鳥事件PHP」或類似的,基於你使用的語言。
既然你在你使用WPF評論說,這裏對一些.NET應用程序代碼的事件通知註冊代碼示例的鏈接:
http://www.firebirdsql.org/index.php?op=devel&sub=netprovider&id=examples#3
重新評論:是的,Firebird事件機制在其攜帶信息的能力方面有限。這是必要的,因爲它可能帶有的任何信息都可能被取消或回滾。例如,如果觸發器發佈事件,但觸發觸發器的操作違反了約束,則取消操作,但不取消事件。所以事件只能是一種「暗示」,可能發生了某些有趣的事情。其他客戶當時需要刷新他們的數據,但他們不知道要尋找什麼。這至少比投票更好。
所以你基本上是描述一個發佈/訂閱機制 - 一個消息隊列。我不確定我會使用RDBMS來實現消息隊列。它可以完成,但你基本上是在重新發明輪子。
這裏是被廣泛關注的幾個消息隊列的產品:
這意味着,當一個客戶端,其他人可能需要了解,該客戶端的方式修改數據也有發佈消息到消息隊列。當消費者客戶看到他們感興趣的消息時,他們知道要刷新他們的一些數據副本。
謝謝你,我知道的事件,我與他們的問題是要知道行已經改變了,所以我能避免與服務器中的數據每當我收到一個事件的時間比較客戶端數據。你認爲也許我應該做的插入/更新/刪除低谷的存儲過程,這也將寫在一個不同的表,我可以查詢最新的變化,當我收到一個事件? – luvieere 2009-11-21 11:26:21
SQL Server 2005及更高版本支持基於通知的數據源緩存過期。
是您的期望,客戶會得到改變說有點「推」給他們(更可能通知),或者說(和更容易地完成......),其在移動清爽,在結果集移動和一般查詢數據庫重新他們會得到最新的數據? – mjv 2009-11-20 20:05:59
我在數據綁定場景中考慮更多,因爲我的前端位於WPF中。 – luvieere 2009-11-20 20:08:06