專利名稱:數(shù)據(jù)同步的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)同步的方法和系統(tǒng),特別涉及增量數(shù)據(jù)同步的方法和 系統(tǒng)。
背景技術(shù):
近年來,隨著各類移動設(shè)備(如智能手機,個人數(shù)字助理,筆記本電 腦等)的廣泛使用,在機場、高級寫字樓、圖書館、餐館或咖啡館里,移 動辦公的人士比比皆是。移動設(shè)備的用戶實際上可以作為系統(tǒng)服務(wù)器的一 個客戶機,客戶機所取得的現(xiàn)場資料需要與系統(tǒng)服務(wù)器數(shù)據(jù)庫同步,當(dāng)存 在數(shù)據(jù)的多個副本時,這些副本需要保持一致性, 一旦斷開連接,服務(wù)器 與每個客戶機都可以修改各自的數(shù)據(jù)。為了獲得數(shù)據(jù)的一致性,必須建立 連接并且使各個客戶機與服務(wù)器保持同步。數(shù)據(jù)庫同步技術(shù)可以實現(xiàn)不同 數(shù)據(jù)庫之間的數(shù)據(jù)交換,并確保保持所有數(shù)據(jù)庫中數(shù)據(jù)的一致性。
一種提高數(shù)據(jù)庫同步效率的方法是增量數(shù)據(jù)同步,即,在客戶機與服 務(wù)器同步時只需交換變化的數(shù)據(jù),而無需交換全部數(shù)據(jù)。增量數(shù)據(jù)同步的 方法在數(shù)據(jù)庫龐大而內(nèi)容變化較小的情況下極為有利。例如,如果數(shù)據(jù)庫
包含500, 000個產(chǎn)品訂單,并且每天只增加200個或變化200個產(chǎn)品訂單, 那么每天將全部產(chǎn)品訂單(即500, 000)從合并了所有變化的數(shù)據(jù)庫發(fā)送 到另 一 個要求同步的數(shù)據(jù)庫將浪費大量的通信資源。
為了支持增量數(shù)據(jù)同步,傳統(tǒng)的數(shù)據(jù)同步系統(tǒng)在服務(wù)器端維護一個或 多個版本號來跟蹤發(fā)生變化的時間點。當(dāng)客戶機執(zhí)行同步時,從服務(wù)器端 取出相對于最后一次同步的版本的增量數(shù)據(jù)變化。然而,變化的數(shù)據(jù)將在 行級別同步,這意味著不管這行有多少列發(fā)生變化,整行數(shù)據(jù)都將被取出并且被發(fā)送出去。這樣產(chǎn)生的問題是在多數(shù)情況下該行中只有部分列被 更新,然而在有限帶寬的情況下,未發(fā)生變化的列也將初L發(fā)送出去。因此 在一個表包含很多列或未發(fā)生變化的列包含諸如LOG, BINARY或者 XML等當(dāng)前越來越常見的大數(shù)據(jù)類型的情況下,極大地降低了同步性能。 目前存在一種在服務(wù)器與客戶機之間的數(shù)據(jù)庫進行增量數(shù)據(jù)同步方 法,該方法主要包括在客戶機端保存客戶機端上一次同步的數(shù)據(jù)副本, 在客戶機與服務(wù)器同步時,在客戶端通過比較客戶端數(shù)據(jù)與上一次同步的 數(shù)據(jù)副本來確定自從上一次同步客戶端數(shù)據(jù)發(fā)生的數(shù)據(jù)列變化,并將該數(shù) 據(jù)列變化廣播到服務(wù)器,從而來確定自從上一次同步服務(wù)器上發(fā)生的數(shù)據(jù) 變化。但是該方法有兩個主要缺點, 一是在同步時需要大量時間實時比較 現(xiàn)有數(shù)據(jù)和原有數(shù)據(jù),增加了同步延遲,降低了同步效率;二是需要在每 一個需要同步的計算機上另外維護一個上一次同步的數(shù)據(jù)副本,增加了大 量的存儲需求。因此這種增量數(shù)據(jù)同步方法的效率是一種傳統(tǒng)的效率低下 的方法。
因此,需要一種改進的、提高同步效率的方法來支持服務(wù)器與客戶機 之間的增量數(shù)據(jù)同步。
發(fā)明內(nèi)容
為了解決上述問題,本發(fā)明設(shè)計了 一種數(shù)據(jù)同步的方法和系統(tǒng)。
根據(jù)本發(fā)明的一個方面,提供一種數(shù)據(jù)同步的方法,包括未同步時 記錄數(shù)據(jù)記錄的變化歷史;響應(yīng)于接收到的同步請求,合并所述數(shù)據(jù)記錄 的變化歷史;發(fā)送所述合并結(jié)果。
根據(jù)本發(fā)明的另一方面,提供一種數(shù)據(jù)同步系統(tǒng),包括記錄裝置, 用于未同步時記錄數(shù)據(jù)記錄的變化歷史;同步引擎,響應(yīng)于接收到的同步 請求,合并所述數(shù)據(jù)記錄的變化歷史,并發(fā)送所述合并結(jié)果。
本發(fā)明的方法在未同步時記錄數(shù)據(jù)記錄的變化歷史,在進行同步時使 用高效的合并方法合并數(shù)據(jù)記錄的變化歷史,從而在同步時節(jié)省了大量新 舊版本的比較計算資源,并且不同于將相同數(shù)據(jù)記錄的所有變化數(shù)據(jù)記錄發(fā)送到對方,而僅似目互交換數(shù)據(jù)記錄中變化的字段,同步雙方各自將變 化的字段從一端發(fā)送到另一端,從而提高同步效率。
附圖簡述
結(jié)合附圖,通過參考下列詳細的示例性實施例的描述,將會更好地理 解本發(fā)明本身、優(yōu)選的實施方式以及本發(fā)明的目標(biāo)和優(yōu)點,其中
圖1示出本發(fā)明的數(shù)據(jù)同步方法的流程圖2示出根據(jù)本發(fā)明的服務(wù)器與客戶機之間進行數(shù)據(jù)同步的系統(tǒng)示意
圖3示出根據(jù)本發(fā)明的服務(wù)器與客戶機之間進行數(shù)據(jù)同步的流程圖4A示出服務(wù)器端源數(shù)據(jù)表的示例;
圖4B示出服務(wù)器端的歷史表模式;
圖4C示出服務(wù)器端第一次加栽源數(shù)據(jù)表的歷史表的示例;
圖5A示出服務(wù)器端第一次發(fā)生變化之后的源數(shù)據(jù)表的示例;
圖5B示出服務(wù)器端第二次加載源數(shù)據(jù)表的歷史表的示例;
圖6A示出服務(wù)器端第五次加載源數(shù)據(jù)表之前的源數(shù)據(jù)表的示例;
圖6B示出服務(wù)器端在第五次加載源數(shù)據(jù)表之后的歷史表的示例;
圖7示出才艮據(jù)本發(fā)明的利用翁:據(jù)記錄的變化歷史進行合并的方法流程
圖8詳細描述了圖7中合并數(shù)據(jù)記錄的工作過程流程圖; 圖9示出使用圖8中的方法進行合并的示例; 圖IOA示出客戶機數(shù)據(jù)表的模式; 圖IOB示出客戶機數(shù)據(jù)表的示例;
圖10C示出經(jīng)過一些變化之后的圖10B的客戶機lt據(jù)表的示例; 圖11示出根據(jù)本發(fā)明的處理服務(wù)器與客戶機之間沖突的方法示意圖; 圖12示出本發(fā)明的同步系統(tǒng)示意圖。
發(fā)明詳述下面結(jié)合附圖詳細描述本發(fā)明的數(shù)據(jù)同步方法和系統(tǒng)。
本發(fā)明的數(shù)據(jù)同步方法涉及存儲在任何存儲介質(zhì)的數(shù)據(jù)記錄,數(shù)據(jù)記 錄包括多個表示數(shù)據(jù)記錄屬性、特征的字段。根據(jù)本發(fā)明的數(shù)據(jù)記錄能夠 利用某種屬性或特征來唯一標(biāo)識,例如可以在數(shù)據(jù)記錄中創(chuàng)建一個字段, 這個字段的值是某種形式的唯一數(shù)值(如時間戳),用這個數(shù)值來唯一標(biāo) 識數(shù)據(jù)記錄。
參照圖1描述根據(jù)本發(fā)明的數(shù)據(jù)同步的方法,在步驟101,未同步時
記錄數(shù)據(jù)記錄的變化歷史;在步驟102,響應(yīng)于接收到的同步請求,合并 所述數(shù)據(jù)記錄的變化歷史;在步驟103發(fā)送所述合并結(jié)果。
根據(jù)本發(fā)明的實施例,所述數(shù)據(jù)記錄的變化歷史為數(shù)據(jù)字段的變化歷 史。所述變化歷史通過變化類型、變化位以及版本號來記錄,所述變化類 型用于記錄所述數(shù)據(jù)記錄變化的變化類型,所述變化位用于記錄與所述數(shù) 據(jù)記錄的變化類型對應(yīng)的字段變化狀態(tài),并且所述版本號用于標(biāo)記所述數(shù) 據(jù)記錄的有效時間點。
本發(fā)明的數(shù)據(jù)同步的方法可以應(yīng)用于服務(wù)器與 一個客戶機之間以及服 務(wù)器與多個客戶機之間的計算機網(wǎng)絡(luò)系統(tǒng),在服務(wù)器與客戶機中存儲有數(shù) 據(jù)記錄,每個數(shù)據(jù)記錄包括多個表示數(shù)據(jù)記錄屬性、特征的字段。圖2示 出根據(jù)本發(fā)明的服務(wù)器與客戶機之間進行數(shù)據(jù)同步的系統(tǒng)示意圖,該系統(tǒng) 包括服務(wù)器200和多個客戶機204, 207, 210,服務(wù)器側(cè)存儲有需要與客 戶機同步的數(shù)據(jù)記錄表201,對于數(shù)據(jù)記錄表中的每個數(shù)據(jù)記錄,存在記 錄該數(shù)據(jù)記錄變化歷史的歷史表202。在客戶機204、 207、 210分別存儲 有數(shù)據(jù)記錄表205、 208、 211,所述客戶機端數(shù)據(jù)記錄表包含與服務(wù)器側(cè) 的數(shù)據(jù)記錄表相同或部分相同的數(shù)據(jù)。歷史表202和數(shù)據(jù)記錄表205、 208、 211分別記錄服務(wù)器端和客戶機端數(shù)據(jù)記錄的變化類型和變化位,從而記 錄服務(wù)器端和客戶機端數(shù)據(jù)記錄的變化狀態(tài)。服務(wù)器包括同步引擎103, 用于合并服務(wù)器端數(shù)據(jù)記錄的變化歷史以及識別服務(wù)器與客戶機以及客戶 機與客戶機之間的沖突,客戶機204、 207、 210分別包括同步引擎206、 209、 212,用于合并客戶機端數(shù)據(jù)記錄。服務(wù)器同步引擎與客戶機同步引擎可以進行通信來執(zhí)行雙向數(shù)據(jù)同步,各自將數(shù)據(jù)記錄中變化的字段發(fā)送 給對方。
圖3示出根據(jù)本發(fā)明的在服務(wù)器與客戶機之間進行數(shù)據(jù)同步的流程 圖。在步驟301,在服務(wù)器端記錄數(shù)據(jù)記錄的變化歷史,例如,存在有一 個記錄數(shù)據(jù)記錄的變化歷史的歷史表,其中所述歷史表中包括變化類型、 變化位以及版本號,所述變化類型用來記錄所述數(shù)據(jù)記錄變化的變化類型, 而所述變化位用來記錄與所述數(shù)據(jù)記錄的變化類型對應(yīng)的字段變化狀態(tài), 并且所述版本號用于標(biāo)記所述數(shù)據(jù)記錄的有效時間點。在步驟303,響應(yīng) 于接收到的客戶機的同步請求,服務(wù)器合并數(shù)據(jù)記錄的變化歷史,利用歷 史表合并相同數(shù)據(jù)記錄的多個變化數(shù)據(jù)記錄的變化類型和變化位并產(chǎn)生對 于客戶機的增量變化字段。服務(wù)器將根據(jù)合并結(jié)果產(chǎn)生一個或兩個發(fā)送操 作并將所述發(fā)送操作發(fā)送給客戶機。在步驟302,在客戶機端記錄當(dāng)前時 刻的數(shù)據(jù)記錄相對于上一次同步的變化狀態(tài),所述客戶機包含的數(shù)據(jù)記錄 與服務(wù)器端的數(shù)據(jù)記錄全部或部分相同,所述客戶機利用變化類型和變化 位來記錄當(dāng)前時刻的數(shù)據(jù)記錄相對于上一次同步的變化狀態(tài),其中所述變 化類型用于記錄當(dāng)前時刻客戶機的數(shù)據(jù)記錄相對于上一次同步的變化類 型,所述變化位用于記錄與所述客戶機的數(shù)據(jù)記錄的變化類型對應(yīng)的字段 變化狀態(tài)。在步驟304,在服務(wù)器與客戶機進行雙向通信時僅僅相互交換 變化的字段,各自將變化的字段從一端發(fā)送到另一端。在步驟305,服務(wù) 器將來自不同客戶端的變化位進行比較來識別服務(wù)器與客戶機以及客戶機 與客戶機之間的沖突。
如果添加數(shù)據(jù)記錄,則設(shè)置所述數(shù)據(jù)記錄的變化類型為添加并且標(biāo)記 所述數(shù)據(jù)記錄的變化位;如果刪除數(shù)據(jù)記錄,則設(shè)置所述數(shù)據(jù)記錄的變化 類型為刪除并且標(biāo)記所述數(shù)據(jù)記錄的變化位;如果更新數(shù)據(jù)記錄,則設(shè)置 所述數(shù)據(jù)記錄的變化類型為更新并且標(biāo)記所述數(shù)據(jù)記錄的變化位。
根據(jù)本發(fā)明的實施例,服務(wù)器端和客戶機端的數(shù)據(jù)記錄可以存儲在數(shù) 據(jù)庫中,圖4A示出服務(wù)器端源數(shù)據(jù)表的示例,該源數(shù)據(jù)表中有三列整數(shù) 類型(C1, C2, C3), —列可變字符串類型(CCHAR),以及一列二進制大數(shù)據(jù)類型(CBLOB ),其中Cl是主關(guān)鍵字列,其余C2, C3, CCHAR 以及CBLOB是非主關(guān)鍵字列。在源數(shù)據(jù)表中存在初始化的兩行數(shù)據(jù)。
圖4B示出歷史表模式,歷史表記錄了服務(wù)器端源數(shù)據(jù)表中源數(shù)據(jù)行 的變化歷史,源數(shù)據(jù)行的變化將被定時捕捉,并將每個源數(shù)據(jù)行的變化用 歷史表中的一個變化行來表示。歷史表模式包含主關(guān)鍵字列PK column, 非主關(guān)鍵字列Non-PK Column, From版本號,To版本號,變化類型 ChangeType以及變化位ChangeBits。 From版本號和to版本號是用于標(biāo) 記源數(shù)據(jù)行的變化行在兩個相對時間點有效的版本號,from版本號表示變 化行開始存在的時間點,而to版本號表示變化行有效屆滿的時間點,即意 味著該變化行要出現(xiàn)新的變化。源數(shù)據(jù)表的所有變化行都將被捕獲并被周 期地加載到歷史表中。根據(jù)本發(fā)明的實施例,如果添加源數(shù)據(jù)行,則可以 設(shè)置所述源數(shù)據(jù)行的變化類型ChangeType為'T (添加)并且標(biāo)記變化 位Changebits,例如將變化位Changebits的所有位置為1;如果刪除源數(shù) 據(jù)行,則可以設(shè)置所述源數(shù)據(jù)行的變化類型ChangeType為 "D"(刪除) 并且標(biāo)記變化位Changebits,例如將變化位Changebits的所有位置為0; 如果更新源數(shù)據(jù)行,則可以設(shè)置所述源數(shù)據(jù)行的變化類型ChangeType為 更新"U"并且標(biāo)記變化位Changebits,例如可以將與所述源數(shù)據(jù)行的更 新的列相對應(yīng)的變化位Changebits置為1以及將與所述源數(shù)據(jù)行的未更新 的列相對應(yīng)的變化位Changebits置為0。
圖4C示出第一次加載源數(shù)據(jù)表的歷史表,所有數(shù)據(jù)列與源數(shù)據(jù)表相 同。歷史表中的每一行用來記錄源數(shù)據(jù)表中的源數(shù)據(jù)行的每個變化行,對 于源數(shù)據(jù)行的每一個變化行,例如主關(guān)鍵字列Cl為1的源數(shù)據(jù)行,from 版本號是該源數(shù)據(jù)行開始存在的當(dāng)前版本號1, to版本號是該源數(shù)據(jù)行有 效屆滿的版本號oo(最大值oo表示該變化行對應(yīng)源數(shù)據(jù)表中當(dāng)前行)。
ChangeType為"I"表明該源數(shù)據(jù)行的變化類型為'T,(添加),ChangeBits 是二進制數(shù)據(jù)類型(1111),它的位數(shù)是該源數(shù)據(jù)表中非主關(guān)鍵字列的數(shù) 目,因此對于源數(shù)據(jù)表中的四個非主關(guān)鍵列字,ChangeBits是四位二進制 數(shù),其從左至右每一位表示主關(guān)鍵字列Cl為1、變化類型為"I"(添加)的源數(shù)據(jù)行所對應(yīng)的該源數(shù)據(jù)行的非主關(guān)鍵字列從左至右每列的變化狀 態(tài)。
圖5A-5B示出第一次發(fā)生變化之后的源數(shù)據(jù)表和歷史表,其中圖5A 示出第一次發(fā)生變化之后的源數(shù)據(jù)表,該源數(shù)據(jù)表中存在多個變化,主關(guān) 鍵字列Cl為1的源數(shù)據(jù)行的C2列被更新為"11",并且添加了主關(guān)鍵字 列Cl為3的源數(shù)據(jù)行。圖5B示出第二次加載源數(shù)據(jù)表的歷史表,相應(yīng)地, 在歷史表中存在一個主關(guān)鍵字列Cl為3的新變化行,from版本號是該源 數(shù)據(jù)行開始存在的當(dāng)前版本號2, to版本號是該源數(shù)據(jù)行有效屆滿的版本 號oo,其中ChangeType是 T (添加)并且ChangeBits是(1111), 以此來標(biāo)記新添加的源數(shù)據(jù)行。此外還存在另一個主關(guān)鍵字列Cl為1的 新變化行,from版本號是該源數(shù)據(jù)行開始存在的當(dāng)前版本號2, to版本號 是該源數(shù)據(jù)行有效屆滿的版本號oo,其中ChangeType是"U"(更新)并 且ChangeBits是(1000 ),以此來標(biāo)記源數(shù)據(jù)表中主關(guān)鍵字列Cl為1的 源數(shù)據(jù)行的第一個非主關(guān)鍵字列被更新。同時原歷史表中主關(guān)鍵字列Cl 為1的變化行對應(yīng)的to版本號被更新為1,表示該源數(shù)據(jù)行的變化在版本 號1之前生效。
圖6A-6B示出多次變化之后的源數(shù)據(jù)表和歷史表,圖6A示出第五次 加載源數(shù)據(jù)表之前的源數(shù)據(jù)表,由于源數(shù)據(jù)表在第 一次變化之后沒有變化, 因此第二次至第四次加載源數(shù)據(jù)表之后的歷史表沒有變化,在第五次加載 源數(shù)據(jù)表之前,源數(shù)據(jù)表存在一些變化,主關(guān)鍵字列Cl為1的源數(shù)據(jù)行 的第一行的CCHAR列被更新為,aaaaaa,并且將主關(guān)鍵字列Cl為2的源數(shù) 據(jù)行刪除。圖6B示出在第五次加載源數(shù)據(jù)表之后的歷史表,相應(yīng)地,在 歷史表中增加了兩個新的變化行, 一個是主關(guān)鍵字列Cl為1的新變化行, from版本號為該源數(shù)據(jù)行開始存在的當(dāng)前版本號"5" , to版本號為該源 數(shù)據(jù)行有效屆滿的版本號"oo" , ChangeType是"U"并且ChangeBits 是(0010),以此來標(biāo)記源數(shù)據(jù)表中主關(guān)鍵字列Cl為1的源數(shù)據(jù)行的第 三個非主關(guān)鍵字列CCHAR被更新。此外還存在另一個主關(guān)鍵字列Cl為 2的新變化行,from版本號為該源數(shù)據(jù)行開始存在的當(dāng)前版本號"5" , to版本號為該源數(shù)據(jù)行有效屆滿的版本號"oo" , ChangeType是"D"并且 ChangeBits是(0000 ),表示源數(shù)據(jù)表中主關(guān)鍵字列Cl為2的行被刪除。 同時將原歷史表中主關(guān)鍵字列Cl為2的變化行的to版本號修改為"4", 表示該源數(shù)據(jù)行的變化在版本4之前生效,并將原歷史表中主關(guān)鍵字列為 1的第二變化行的to版本號修改為"4",表示該源數(shù)據(jù)行的變化在版本4 之前生效。
圖7示出根據(jù)本發(fā)明的利用數(shù)據(jù)記錄的變化歷史進行合并的方法流程 圖。在步驟701,取出自上一次同步之后數(shù)據(jù)記錄的變化歷史;在步驟702, 創(chuàng)建兩個變量合并后的變化類型MergedChangeType和合并后的變化位 MergedChangeBits;在步驟703,判斷是否存在相同數(shù)據(jù)記錄的下一個變 化數(shù)據(jù)記錄,判斷為"是",則前進到步驟704,否則過程結(jié)束。在步驟 704,將相同源數(shù)據(jù)行的變化行合并,并將得到的合并后的變化類型 MergedChangeType和合并后的變化位MergedChangeBits存儲在變量 MergedChangeType和MergedChangeBits 中;在步驟705 , 取出 MergedChangeType的值,該值可以是以下四個值的其中之一"D"(刪 除),"DI"(刪除后添加),"U"(更新)以及"I"(添加)。如果 該值為"D",那么前進到步驟706,生成刪除行操作。如果該值為"DI", 則前進到步驟707,對所有字段產(chǎn)生先刪除,然后添加的操作;如果該值 為"U",則前進到步驟708,生成更新操作,其中包含MergedChangeBits 中標(biāo)記變化的字段;如果該值為'T,,則前進到步驟709,對所有要添加 的列生成添加操作。在步驟610,判斷是否存在下一個數(shù)據(jù)記錄的變化數(shù) 據(jù)記錄,如果判斷為"是",則過程返回到步驟703再次循環(huán),否則前進 到步驟711結(jié)束過程。
圖8詳細描述了圖7中的合并變化數(shù)據(jù)記錄的工作過程,即,如何高 效地計算出對于相同數(shù)據(jù)記錄的多個變化數(shù)據(jù)記錄的合并后的變化類型 MergedChangeType和合并后的變化位MergedChangeBits 。流程的輸入是 自從上一次同步之后相同數(shù)據(jù)記錄的所有變化數(shù)據(jù)記錄,將所有變化數(shù)據(jù) 記錄按照由近及遠的時間順序排序,后發(fā)生的變化行將排在在序列的前面。在步驟801,根據(jù)最近變化數(shù)據(jù)記錄的ChangeType怕進行不同的步驟。
如果最近變化數(shù)據(jù)記錄的ChangeType是 "D"(刪除),那么過程 進行到步驟802,由于不管在之前發(fā)生多少次變化,效果都等同于當(dāng)前的 刪除操作,因此MergedChangeType被設(shè)置為"D ,,以及標(biāo)記 MergedChangeBits,例如將MergedChangeBits i更置為全零,并且下一步 前行到步驟813。
如果最近變化數(shù)據(jù)記錄的ChangeType是 "I"(添加),那么過程 進行到步驟803,如果在最近變化數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的變 化數(shù)據(jù)記錄,則只進行添加操作,過程進行到804, MergedChangeType #皮i殳置為添力口 "I " 以及標(biāo)i己 MergedChangeBits , 例如將 MergedChangeBits設(shè)置為全1;如果在最近變化數(shù)據(jù)記錄之前存在相同數(shù) 據(jù)記錄的變化數(shù)據(jù)記錄,則該變化數(shù)據(jù)記錄的ChangeType—定是刪除, 因為添加操作一定伴隨一個刪除操作,不管在刪除操作和添加操作之前有 多少次變化,最后都等同于刪除后添加的效果,過程進行到步驟805, MergedChangeType被設(shè)置為 "DI "(刪除后添加)以及標(biāo)記 MergedChangeBits,例3一夸MergedChangeBits i殳置為全1 。
如果最近變化數(shù)據(jù)記錄的ChangeType是 "U"(更新),那么前進 到步驟806,首先將變量MergedChangeType和MergedChangeBits的值 設(shè)置為最近變化數(shù)據(jù)記錄的ChangeType和ChangeBits;在步驟807,檢 查在最近變化數(shù)據(jù)記錄之前是否存在相同數(shù)據(jù)記錄的變化數(shù)據(jù)記錄,如果 在最近變化數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的變化數(shù)據(jù)記錄,則過程前 進到步驟813,返回當(dāng)前的MergedChangeType和MergedChangeBits;如 果在最近變化數(shù)據(jù)記錄之前存在相同數(shù)據(jù)記錄的變化數(shù)據(jù)記錄,在步驟 808進一步判斷該變化數(shù)據(jù)記錄的ChangeType,如果該變化數(shù)據(jù)記錄的 ChangeType是"U"(更新),則前進到步驟809,該MergedChangeType 仍舊是更新"U"并且MergedChangeBits將是當(dāng)前MergedChangeBits和 該變化數(shù)據(jù)記錄ChangeBits的按位或邏輯運算結(jié)果,并且過程返回到808 直到將相同數(shù)據(jù)記錄的所有變化數(shù)據(jù)記錄處理完;如果該變化數(shù)據(jù)記錄的ChangeType是添加'T,,則在步驟810,進一步檢查在該變化數(shù)據(jù)記錄之 前是否存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄,如果存在相同數(shù)據(jù)記錄 的下一個變化數(shù)據(jù)記錄,則在步驟811,該下一個變化數(shù)據(jù)記錄的 ChangeType—定是刪除,將MergedChangeType設(shè)置為 "DI"(刪除 后添力口 )以及標(biāo)i己MergedChangeBits,例如4夸MergedChangeBits i殳置為 全1;否則如果不存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄,則在步驟812, 將MergedChangeType設(shè)置為添力口 'T,并且標(biāo)記MergedChangeBits,例 如將MergedChangeBits設(shè)置為全l;在步驟811和步驟812之后,過程前 進到步驟813以返回MergedChangeType和MergedChangeBits。
圖9示出使用圖8中的方法進行變化合并的示例,為了簡單、清楚起 見,以數(shù)據(jù)庫為例,在示例(1)中,具有相同主關(guān)鍵字列的相同源數(shù)據(jù)行 的最近變化行的ChangeType是"D"(刪除),則不管之前存在多少變 化,合并結(jié)果都將是一個刪除操作,因此合并后的MergedChangeType是 刪除"D"以及MergedChangeBits是(0000)。
在示例2中,具有相同主關(guān)鍵字列的相同源數(shù)據(jù)行的最近變化行的 ChangeType是添加'T,,并且在添加之前的變化行的ChangeType是刪 除,則在刪除之前的所有變化都可以被忽略,因此合并后的 MergedChangeType是刪除后添加"DI"以及MergedChangeBits是(1111 )。
在示例3中,具有相同主關(guān)鍵字列的相同源數(shù)據(jù)行的所有變化行的 ChangeType都是更新"U",因此三個更新被合并,MergedChangeType 是更新"U",以及MergedChangeBits是三個ChangeBits的按位或邏輯 運算結(jié)果(0111)。
在示例4中,具有相同主關(guān)鍵字列的相同源數(shù)據(jù)行的變化行的 ChangeType是兩個更新"U"和一個添加'T,,因此MergedChangeType 是添加'T,以及MergedChangeBits是(1111)。
圖IOA-IOC示出客戶機數(shù)據(jù)表的示例,圖IOA示出客戶機數(shù)據(jù)表模式, 客戶機數(shù)據(jù)表模式包含主關(guān)鍵字列PK column,非主關(guān)鍵字列Non-PK Column,變化類型ChangeType以及變化位ChangeBits。圖10B示出客戶機數(shù)據(jù)表的示例,該源數(shù)據(jù)表中有三列整數(shù)類型(C1, C2, C3), 一 列可變字符串類型(CCHAR),以及一列二進制大數(shù)據(jù)類型(CBLOB), 其中C1是主關(guān)鍵字列,其余C2, C3, CCHAR以及CBLOB是非主關(guān)鍵 字列。圖IOC示出經(jīng)過一些變化之后的圖IOB的客戶機數(shù)據(jù)表的示例,例 如,關(guān)鍵字Cl為1的數(shù)據(jù)行由于第三個非關(guān)鍵字列被更新為'aaaaa,, 因此ChangeType是"U"并且ChangeBits是(0010 );關(guān)鍵字列Cl為2 的數(shù)據(jù)行被刪除,因此ChangeType是"D"并且ChangeBits是(0000 ); 關(guān)鍵字列Cl為4的行被添加,因此ChangeType是'T,并且ChangeBits 是(1111)。
如果基于上一次同步之后的客戶機數(shù)據(jù)表的數(shù)據(jù)行的變化還有新的變 化,則客戶機將舊的變化和新的變化合并
在上一次同步之后的數(shù)據(jù)行的ChangeType為 "U"(更新)的情況 下,如果該數(shù)據(jù)行的新的ChangeType是 "D"(刪除),則合并后的 ChangeType將是 "D"(刪除)并且標(biāo)記合并后的ChangeBits,例如將 其標(biāo)記為(0000);如果該數(shù)據(jù)行的新的ChangeType仍舊是 "IJ"(更 新),那么合并后的ChangeType將是"U"(更新),并且合并后的 ChangeBits將是該數(shù)據(jù)4亍上一次同步的ChangeBits與當(dāng)前ChangeBits的 按位或邏輯運算結(jié)果。
在上一次同步之后的數(shù)據(jù)行的ChangeType為 "D"(刪除)的情況 下,該數(shù)據(jù)行的新的ChangeType只能是 'T (添加),那么合并后的 變化類型是"U"(更新),將上一次同步的數(shù)據(jù)行與添加后的數(shù)據(jù)行逐列 進行比較,如果相應(yīng)的列值被改變,則標(biāo)記ChangeBits的相應(yīng)位。
在上一次同步之后的數(shù)據(jù)行的ChangeType為'T (添加)的情況 下,如果該數(shù)據(jù)行的新的ChangeType是更新,那么合并后的ChangeType 將是添加"I"以及標(biāo)記合并后的ChangeBits,例如將其標(biāo)記為全l;如果 該數(shù)據(jù)行的新的ChangeType是刪除"D",則在客戶機數(shù)據(jù)表中該數(shù)據(jù) 行將^f皮整行刪除。
圖11示出在服務(wù)器端和客戶機端都存在更新操作的情況下通過使用來自不同端的ChangeBits處理沖突的過程。在步驟1101,得到來自服務(wù) 器端和客戶機端的對于相同數(shù)據(jù)記錄的ChangeBits。在步驟1102,所有客 戶端的ChangeBits進行按位或邏輯運算,服務(wù)器端的ChangeBits與所得 到的或邏輯運算結(jié)果進行按位與邏輯運算;如果按位與邏輯運算結(jié)果不全 為零,那么在步驟1104,報告服務(wù)器與客戶機之間發(fā)生沖突;如果按位與 邏輯運算結(jié)果為全零,那么在步驟1103,檢查所有客戶機的ChangeBits 的按位與邏輯運算結(jié)果,如果所有客戶機的ChangeBits的按位與邏輯運算 結(jié)果不全為零,那么在步驟1105,報告客戶機與客戶機之間發(fā)生沖突;如 果所有客戶機的ChangeBits的按位與邏輯運算結(jié)果為全零,那么在步驟 1106,報告客戶機與客戶機之間沒有沖突發(fā)生。
圖12示出本發(fā)明的數(shù)據(jù)同步系統(tǒng)1200,包括記錄裝置1201,用于 未同步時記錄數(shù)據(jù)記錄的變化歷史;同步引擎1202,響應(yīng)于接收到的同步 請求,合并所述數(shù)據(jù)記錄的變化歷史,并發(fā)送所述合并結(jié)果。
該記錄裝置用于如果添加數(shù)據(jù)記錄,則記錄所述數(shù)據(jù)記錄的變化類 型為添加并且標(biāo)記所述數(shù)據(jù)記錄的變化位;如果刪除數(shù)據(jù)記錄,則記錄所 述數(shù)據(jù)記錄的變化類型為刪除并且標(biāo)記所述數(shù)據(jù)記錄的變化位;如果更新 數(shù)據(jù)記錄,則記錄所述數(shù)據(jù)記錄的變化類型為更新并且標(biāo)記所述數(shù)據(jù)記錄 的變化位。
所述同步引擎還包括合并裝置,所述合并裝置用于分別將對應(yīng)于相同 數(shù)據(jù)記錄的所有變化的變化類型和變化位進行合并,得到合并后的變化類 型和合并后的變化位。其中合并裝置還包括刪除合并裝置,如果所述相 同數(shù)據(jù)記錄的最近變化類型為刪除,則將合并后的變化類型設(shè)置為刪除并 標(biāo)識合并后的變化位;添加合并裝置,如果所述相同數(shù)據(jù)記錄的最近變化 數(shù)據(jù)記錄的變化類型為添加,則在所述最近數(shù)據(jù)記錄之前不存在相同數(shù)據(jù) 記錄的下一個變化數(shù)據(jù)記錄的情況下,將合并后的變化類型"i殳置為添加并 標(biāo)識合并后的變化位,否則在所述最近數(shù)據(jù)記錄之前存在相同數(shù)據(jù)記錄的 下一個變化數(shù)據(jù)記錄的情況下,將合并后的變化類型設(shè)置為刪除后添加并 標(biāo)識合并后的變化位;更新合并裝置,在所述相同數(shù)據(jù)記錄的最近變化記錄的變化類型為更新的情況下,如果在所述最近變化數(shù)據(jù)記錄之前不存在 相同數(shù)椐記錄的下一個變化數(shù)據(jù)記錄,則將所述最近變化數(shù)據(jù)記錄的變化
類型和變化位分別設(shè)置為合并后的變化類型和合并后的變化位;如果在所 述最近變化數(shù)據(jù)記錄之前存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄并且所 述下一個變化數(shù)據(jù)記錄的變化類型是更新,則合并后的變化類型是更新, 合并后的變化位是當(dāng)前合并后的變化位與所述下一個變化數(shù)據(jù)記錄的變化 位的按位或邏輯運算結(jié)果。如果在所述最近變化數(shù)據(jù)記錄之前存在相同數(shù) 據(jù)記錄的下一個變化數(shù)據(jù)記錄并且所述下一個變化數(shù)據(jù)記錄的變化類型是 添加,則進一步檢查在該變化數(shù)據(jù)記錄之前是否存在相同數(shù)據(jù)記錄的下一 個變化數(shù)據(jù)記錄,如果存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄,則將合 并后的變化位設(shè)置為刪除后添加并且標(biāo)記合并后的變化位;否則如果不存 在相同數(shù)據(jù)記錄的下 一個變化數(shù)據(jù)記錄,則將合并后的變化位設(shè)置為添加 并且標(biāo)記合并后的變化位。
當(dāng)數(shù)據(jù)同步系統(tǒng)用于服務(wù)器與多個客戶機之間進行數(shù)據(jù)同步時同步引 擎還包括沖突檢測裝置,所述沖突檢測裝置用于l)分別接收來自服務(wù)器 端和多個客戶端的對于相同數(shù)據(jù)記錄的變化位;2 )對所有來自客戶機端的 變化位進行按位或邏輯運算;3)對來自服務(wù)器端的變化位以及所述客戶機 端的按位或邏輯運算結(jié)果進行按位與邏輯運算;4)根據(jù)所述按位與邏輯運 算結(jié)果來判斷所述服務(wù)器與客戶機之間是否發(fā)生沖突。
本發(fā)明的數(shù)據(jù)同步系統(tǒng)中合并裝置的具體實現(xiàn)方法可以參照圖8和圖 9的合并方法的流程來實現(xiàn),在此不--贅述。
本發(fā)明可以硬件、軟件、固件或其組合的方式實現(xiàn)。本發(fā)明可以集中 的方式在一個計算機系統(tǒng)中實現(xiàn),或以分布方式實現(xiàn),在這種分布方式中, 不同的部件分布在若干互連的計算機系統(tǒng)中。適于執(zhí)行本文中描述的方法 的任何計算機系統(tǒng)或其它裝置都是合適的。優(yōu)選地,本發(fā)明以計算機軟件 和通用計算機硬件的組合的方式實現(xiàn),在這種實現(xiàn)方式中,當(dāng)該計算機程 序被加載和執(zhí)行時,控制該計算機系統(tǒng)而使其執(zhí)行本發(fā)明的方法,或構(gòu)成 本發(fā)明的系統(tǒng)。上面出于舉例說明的目的,給出了本發(fā)明的優(yōu)選實施例的說明。優(yōu)選
實施例的上述說明不是窮盡的,也不打算把本發(fā)明局限于^Hf的明確形式, 顯然鑒于上述教導(dǎo),許多修改和變化是可能的。對本領(lǐng)域的技術(shù)人員來說 顯而易見的這種修改和變化包括在由附加的權(quán)利要求限定的本發(fā)明的范圍 內(nèi)。
權(quán)利要求
1.一種數(shù)據(jù)同步的方法,包括未同步時記錄數(shù)據(jù)記錄的變化歷史;響應(yīng)于接收到的同步請求,合并所述數(shù)據(jù)記錄的變化歷史;發(fā)送所述合并結(jié)果。
2. 如權(quán)利要求l所述的方法,其中所述數(shù)據(jù)記錄的變化歷史為數(shù)據(jù)記 錄的字段的變化歷史。
3. 如權(quán)利要求2所述的方法,其中所述變化歷史通過變化類型、變化 位以及版本號來記錄,所述變化類型用于記錄所述數(shù)據(jù)記錄變化的變化類 型,所述變化位用于記錄與所述數(shù)據(jù)記錄的變化類型對應(yīng)的字段變化狀態(tài), 并且所述版本號用于標(biāo)記所述數(shù)據(jù)記錄的有效時間點。
4. 如權(quán)利要求3所述的方法,其中合并所述變化歷史的步驟包括分 別將對應(yīng)于相同數(shù)據(jù)記錄的所有變化的變化類型和變化位進行合并,得到 合并后的變化類型和合并后的變化位。
5. 如權(quán)利要求4所述的方法,其中記錄數(shù)據(jù)記錄的變化歷史的步驟還 包括如果添加數(shù)據(jù)記錄,則設(shè)置所述數(shù)據(jù)記錄的變化類型為添加并且標(biāo)記 所述數(shù)據(jù)記錄的變化位;如果刪除數(shù)據(jù)記錄,則設(shè)置所述數(shù)據(jù)記錄的變化類型為刪除并且標(biāo)記 所述數(shù)據(jù)記錄的變化位;如果更新數(shù)據(jù)記錄,則設(shè)置所述數(shù)據(jù)記錄的變化類型為更新并且標(biāo)記 所述數(shù)據(jù)記錄的變化位。
6. 如權(quán)利要求5所述的方法,其中所述合并相同數(shù)據(jù)記錄的所有變化 數(shù)據(jù)記錄的變化類型和變化位的步驟還包括如果所述相同數(shù)據(jù)記錄的最近變化數(shù)據(jù)記錄的變化類型為刪除,則將 合并后的變化類型設(shè)置為刪除并標(biāo)識合并后的變化位;如果所述相同數(shù)據(jù)記錄的最近變化數(shù)據(jù)記錄的變化類型為添加,則在所述最近數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄的情況 下,將合并后的變化類型設(shè)置為添加并標(biāo)識合并后的變化位,否則在所述 最近數(shù)據(jù)記錄之前存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄的情況下,將合并后的變化類型設(shè)置為刪除后添加并標(biāo)識合并后的變化位;在所述相同數(shù)據(jù)記錄的最近變化記錄的變化類型為更新的情況下,如 果在所述最近變化數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記 錄,則將所述最近變化數(shù)據(jù)記錄的變化類型和變化位分別設(shè)置為合并后的 變化類型和合并后的變化位;如果在所述最近變化數(shù)據(jù)記錄之前存在相同 源數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄并且所述下一個變化數(shù)據(jù)記錄的變化類 型是更新,則合并后的變化類型是更新,合并后的變化位是當(dāng)前合并后的 變化位與所述下一個變化數(shù)據(jù)記錄的變化位的按位或邏輯運算結(jié)果。
7. 如權(quán)利要求3所述的方法,當(dāng)所述方法用于服務(wù)器與多個客戶機之 間進行數(shù)據(jù)同步時還包括沖突判斷步驟,該步驟包括1) 分別接收來自服務(wù)器端和多個客戶端的對于相同數(shù)據(jù)記錄的變化位;2) 對所有來自客戶機端的變化位進行按位或邏輯運算;3 )對來自服務(wù)器端的變化位以及所述客戶機端的按位或邏輯運算結(jié)果 進行按位與邏輯運算;4 )根據(jù)所述按位與邏輯運算結(jié)果來判斷所迷服務(wù)器與客戶機之間是否 發(fā)生沖突。
8. 如權(quán)利要求9所述的方法,進一步包括在所述服務(wù)器與客戶機之 間沒有沖突發(fā)生的情況下,對所有來自客戶機端的變化位進行按位與邏輯 運算,根據(jù)所述客戶機端的的按位與邏輯運算結(jié)果判斷客戶機與客戶機之間是否發(fā)生沖突。
9. 如權(quán)利要求l-3所述的方法,其中所述數(shù)據(jù)記錄存儲在數(shù)據(jù)庫中。
10. —種數(shù)據(jù)同步系統(tǒng),包括記錄裝置,用于未同步時記錄數(shù)據(jù)記錄的變化歷史;同步引擎,響應(yīng)于接收到的同步請求,合并所述數(shù)據(jù)記錄的變化歷史,并發(fā)送所述合并結(jié)果。
11. 如權(quán)利要求10所述的系統(tǒng),其中所述數(shù)據(jù)記錄的變化歷史為數(shù)據(jù)記錄的字段的變化歷史。
12. 如權(quán)利要求ll所述的系統(tǒng),其中所述變化歷史通過變化類型、變 化位以及版本號來記錄,所述變化類型用于記錄所述數(shù)據(jù)記錄變化的變化 類型,所述變化位用于記錄與所述數(shù)據(jù)記錄的變化類型對應(yīng)的字段變化狀 態(tài),并且所述版本號用于標(biāo)記所述數(shù)據(jù)記錄的有效時間點。
13. 如權(quán)利要求12所述的系統(tǒng),其中所述同步引擎還包括合并裝置, 所述合并裝置用于分別將對應(yīng)于相同數(shù)據(jù)記錄的所有變化的變化類型和變 化位進行合并,得到合并后的變化類型和合并后的變化位。
14. 如權(quán)利要求13所述的系統(tǒng),其中所述記錄裝置還用于 如果添加數(shù)據(jù)記錄,則記錄所述數(shù)據(jù)記錄的變化類型為添加并且標(biāo)記所述數(shù)據(jù)記錄的變化位;如果刪除數(shù)據(jù)記錄,則記錄所述數(shù)據(jù)記錄的變化類型為刪除并且標(biāo)記 所述數(shù)據(jù)記錄的變化位;如果更新數(shù)據(jù)記錄,則記錄所迷數(shù)據(jù)記錄的變化類型為更新并且標(biāo)記 所述數(shù)據(jù)記錄的變化位。
15. 如權(quán)利要求14所述的系統(tǒng),其中所述同步引擎還包括 刪除合并裝置,如果所迷相同數(shù)據(jù)記錄的最近變化類型為刪除,則將合并后的變化類型設(shè)置為刪除并標(biāo)識合并后的變化位;添加合并裝置,如果所述相同數(shù)據(jù)記錄的最近變化數(shù)據(jù)記錄的變化類 型為添加,則在所述最近數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的下一個變化 數(shù)據(jù)記錄的情況下,將合并后的變化類型設(shè)置為添加并標(biāo)識合并后的變化 位,否則在所述最近數(shù)據(jù)記錄之前存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記 錄的情況下,將合并后的變化類型設(shè)置為刪除后添加并標(biāo)識合并后的變化 位;更新合并裝置,在所述相同數(shù)據(jù)記錄的最近變化記錄的變化類型為更 新的情況下,如果在所述最近變化數(shù)據(jù)記錄之前不存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄,則將所述最近變化數(shù)據(jù)記錄的變化類型和變化位分別設(shè)置為合并后的變化類型和合并后的變化位;如果在所述最近變化數(shù)據(jù)記 錄之前存在相同數(shù)據(jù)記錄的下一個變化數(shù)據(jù)記錄并且所述下一個變化數(shù)據(jù) 記錄的變化類型是更新,則合并后的變化類型是更新,合并后的變化位是 當(dāng)前合并后的變化位與所述下一個變化數(shù)據(jù)記錄的變化位的按位或邏輯運 算結(jié)果。
16. 如權(quán)利要求13所述的系統(tǒng),當(dāng)所述系統(tǒng)用于服務(wù)器與多個客戶機 之間進行數(shù)據(jù)同步時所述同步引擎還包括沖突檢測裝置,所述沖突檢測裝 置用于1) 分別接收來自服務(wù)器端和多個客戶端的對于相同數(shù)據(jù)記錄的變化位;2) 對所有來自多個客戶機端的變化位進行按位或邏輯運算;3) 對來自服務(wù)器端的變化位以及所M戶機端的的按位或邏輯運算結(jié) 果進行按位與邏輯運算;4) 根據(jù)所述按位與邏輯運算結(jié)果來判斷所述服務(wù)器與客戶機之間是否 發(fā)生沖突。
17. 如權(quán)利要求16所述的方法,其中所述沖突檢測裝置還用于在所述 服務(wù)器與客戶機之間沒有沖突發(fā)生的情況下,對所有來自客戶機端的對于相同數(shù)據(jù)記錄的變化位進行按位與邏輯運算,根據(jù)所述客戶機端的變化位 的按位與邏輯運算結(jié)果判斷客戶機與客戶機之間是否發(fā)生沖突。
18. 如權(quán)利要求10-13所述的方法,其中所述數(shù)據(jù)記錄存儲在數(shù)據(jù)庫中。
全文摘要
本發(fā)明公開一種數(shù)據(jù)同步的方法和系統(tǒng),該數(shù)據(jù)同步的方法包括未同步時記錄數(shù)據(jù)記錄的變化歷史;響應(yīng)于接收到的同步請求,合并所述數(shù)據(jù)記錄的變化歷史;發(fā)送所述合并結(jié)果。本發(fā)明通過高效的合并方法合并數(shù)據(jù)記錄的合并歷史,各自將變化的字段從一端發(fā)送到另一端,從而提高同步效率。
文檔編號G06F17/30GK101551801SQ20081008862
公開日2009年10月7日 申請日期2008年3月31日 優(yōu)先權(quán)日2008年3月31日
發(fā)明者亮 齊 申請人:國際商業(yè)機器公司