本發(fā)明涉及計算機網絡技術領域,具體涉及一種數據同步方法及裝置。
背景技術:
基于分布式文件存儲的數據庫,一般由特定語言編寫,旨在為WEB應用提供可擴展的高性能數據存儲解決方案。由于單一數據庫的處理能力有限,因此在分布式文件存儲數據庫的解決方案中,基于源數據庫,按照業(yè)務或功能建立多個目標數據庫,從而降低對源數據庫的訪問壓力。當源數據庫中的某個數據表發(fā)生變化時,需要保證關注該數據表的目標數據庫中的該數據表與源數據庫中的該數據表發(fā)生一致的變化,因此需要一個同步裝置來實現目標數據庫與源數據庫之間數據的同步。
現有的同步裝置所采取的同步方法是,從源數據庫讀取一條數據,向目的數據庫寫入該條數據之后,再從源數據庫讀取下一條數據,繼續(xù)寫入,直至所有數據同步完成。由于數據寫入的速度遠低于數據讀取的速度,現有的同步方法中數據寫入占用的時間過長,影響了數據同步效率。
技術實現要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的數據同步方法及裝置。
根據本發(fā)明的一個方面,提供了一種數據同步方法,其包括:
從源數據庫中讀取數據;
將讀取的數據打包成數據塊;
將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知;
接收到廣播通知的空閑線程從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
根據本發(fā)明的另一方面,提供了一種數據同步裝置,其包括:
數據讀取模塊,適于從源數據庫中讀取數據;
打包模塊,適于將讀取的數據打包成數據塊;
保存模塊,適于將數據塊保存到數據塊池中;
通知模塊,適于向多個線程處理模塊發(fā)送廣播通知;
多個線程處理模塊,其中處于空閑狀態(tài)的線程處理模塊適于:從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
根據本發(fā)明提供的數據同步方法及裝置,從源數據庫中讀取數據,將讀取的數據打包成數據塊;將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知;接收到廣播通知的空閑線程從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。本發(fā)明提供的方案不考慮待同步對象的順序問題。由于數據庫中的數據本身之間無順序,在同步過程中,無需考慮數據之間的順序問題,因此可以采取并行處理的方式,具體通過多個線程執(zhí)行將數據塊寫入目的數據庫的操作,多個線程并行運行,一個線程從數據塊池中讀取一個數據塊后,就執(zhí)行寫入操作,寫入完成空閑后,如果數據塊池中又有新的數據塊,再去讀取并寫入,這種多個線程并行處理的方式大大提高了數據寫入的速度,解決了由于數據寫入的速度遠低于數據讀取的速度而導致的數據寫入占用的時間過長的問題,提升了數據同步效率。
上述說明僅是本發(fā)明技術方案的概述,為了能夠更清楚了解本發(fā)明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了根據本發(fā)明一個實施例的數據同步方法的流程示意圖;
圖2示出了根據本發(fā)明另一個實施例的數據同步方法的流程示意圖;
圖3示出了根據本發(fā)明一個實施例的數據同步裝置的功能框圖。
具體實施方式
下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。
為了能提升數據同步效率,本發(fā)明實施例提供了一種數據同步方法,該方法為一種第三方解決方案,即通過開發(fā)的第三方工具實現將源數據庫的數據同步給目的數據庫。舉例來說,通過中間件實現本發(fā)明實施例的方法,中間件與源數據庫之間建立用于讀取數據的連接,中間件與目的數據庫之間建立用于寫入數據的連接。中間件執(zhí)行如下實施例提供的方法,能夠提升源數據庫和目的數據庫之間的數據同步效率。由于利用了中間件,源數據庫和目的數據庫之間并未直接建立連接,不會改變分布式系統(tǒng)中數據庫之間的連接關系,因而不會觸發(fā)因新建連接而導致的主數據庫選舉機制,也就不會引起因主數據塊選舉機制導致的數據庫性能受影響的問題。
圖1示出了根據本發(fā)明一個實施例的數據同步方法的流程示意圖。如圖1所示,該方法包括如下步驟:
步驟S101,從源數據庫中讀取數據。
首先,中間件預先與源數據庫建立用于讀取數據的至少一條連接?;跀祿懭氲乃俣冗h低于數據讀取的速度的現狀,中間件與源數據庫之間建立一條用于讀取數據的連接,即可滿足中間件的處理需求。利用所建立的連接,中間件從源數據庫中讀取數據。具體地,源數據庫開設一數據讀取端口,中間件訪問該數據讀取端口讀取一條條數據。
步驟S102,將讀取的數據打包成數據塊。
中間件從源數據庫中讀取一條條數據,每條數據的數據量比較小。為了增強處理性能,中間件將讀取的數據打包成數據塊,每個數據塊包含若干條數據。數據塊具有預設塊大小,該預設塊大小可根據經驗來設定,本發(fā)明對此不作限制。
步驟S103,將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知。
中間件內部預先建立了數據塊池,并創(chuàng)建了多個線程,每個線程與目的數據庫之間建立有一條用于寫入數據的連接。中間件將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知,以通知各個線程有新的數據塊需要寫入。
步驟S104,接收到廣播通知的空閑線程從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
接收到廣播通知的線程根據自身的工作狀態(tài)選擇是否讀取數據塊。為了提高處理速度,本發(fā)明要求空閑的線程才可從數據塊池中讀取數據塊。如果在發(fā)送廣播通知后,當前中間件內沒有空閑的線程,則數據塊暫存于數據塊池中,等待中間件內有線程空閑后,再從數據塊池中讀取一個數據塊,讀取成功后執(zhí)行將數據塊寫入目的數據庫的操作。
利用本實施例提供的數據同步方法,從源數據庫中讀取數據,將讀取的數據打包成數據塊;將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知;接收到廣播通知的空閑線程從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。本實施例提供的方法不考慮待同步對象的順序問題。由于數據庫中的數據本身之間無順序,在同步過程中,無需考慮數據之間的順序問題,因此可以采取并行處理的方式,具體通過多個線程執(zhí)行將數據塊寫入目的數據庫的操作,多個線程并行運行,一個線程從數據塊池中讀取一個數據塊后,就執(zhí)行寫入操作,寫入完成空閑后,如果數據塊池中又有新的數據塊,再去讀取并寫入,這種多個線程并行處理的方式大大提高了數據寫入的速度,解決了由于數據寫入的速度遠低于數據讀取的速度而導致的數據寫入占用的時間過長的問題,提升了數據同步效率。
圖2示出了根據本發(fā)明另一個實施例的數據同步方法的流程示意圖。如圖2所示,該方法包括如下步驟:
步驟S201,與源數據庫建立用于讀取數據的至少一條連接,以及創(chuàng)建多個線程,且每個線程與目的數據庫建立一條用于寫入數據的連接。
中間件預先與源數據庫建立用于讀取數據的至少一條連接?;跀祿懭氲乃俣冗h低于數據讀取的速度的現狀,中間件與源數據庫之間建立一條用于讀取數據的連接,即可滿足中間件的處理需求。如果一條連接不能滿足需求,例如數據寫入的速度高于數據讀取的速度,也可以建立兩條及以上用于讀取數據的連接。所謂建立連接具體為源數據庫開設至少一個數據讀取端口,中間件通過訪問該數據讀取端口的方式讀取數據。
中間件還預先創(chuàng)建有多個線程,每個線程與目的數據庫建立一條用于寫入數據的連接。多個線程之間為并行處理方式,各個線程之間的運行互不干擾。所創(chuàng)建的線程的數量可根據實際情況而設定,例如根據需要同步的數據總量,中間件資源消耗狀況等綜合考慮而設定,本發(fā)明對此不作限制。每個線程與目的數據庫建立一條用于寫入數據的連接,具體地,目的數據庫為每個線程開設一數據寫入端口,線程訪問對應的數據寫入端口寫入數據。
步驟S202,從源數據庫中讀取數據。
基于所建立的連接,中間件從源數據庫中讀取數據。
步驟S203,按照預設塊大小,將讀取的數據打包成數據塊。
中間件從源數據庫中讀取一條條數據,每條數據的數據量比較小。為了增強處理性能,中間件將讀取的數據打包成數據塊,每個數據塊包含若干條數據。數據塊具有預設塊大小,該預設塊大小可根據經驗來設定,本發(fā)明對此不作限制。通過將數據打包成數據塊,由于數據塊的大小相對固定,使得后續(xù)各個線程處理一個數據塊的時間相差不大,各個線程之間負載相對均衡,優(yōu)化處理性能。
舉例來說,假設預設塊大小為16M,在進行打包處理時,按照數據讀取的先后順序對先讀取的數據進行打包,當數據量接近16M時,一個數據塊打包完成,繼續(xù)打包下一數據塊。由于每條數據的數據量相差較大,本發(fā)明不嚴格要求每個數據塊的大小都是16M,而是接近16M即可,有的數據塊可略大于16M,有的數據塊可略小于16M。
步驟S204,將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知。
中間件內部預先建立了數據塊池,中間件將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知,以通知各個線程有新的數據塊需要寫入。本發(fā)明中,數據塊池用于暫時存儲數據塊,當多個線程的寫數據的速度不如讀數據的速度快時,數據塊池存儲的數據塊有可能越來越多,為了避免數據量超過數據塊池的內存限制,導致數據塊丟失的問題,本發(fā)明對數據塊池暫存的數據塊的數量或數據量進行限制。
在一個具體實施例中,方法還可包括:判斷數據塊池中的數據塊的數量是否到達預設數量閾值;若是,則停止從源數據庫中讀取數據,直至數據塊池中的數據塊的數量小于預設數量閾值。在這個實施例中,對數據塊池暫存的數據塊的數量限制為不能超過預設數量閾值,一旦超過,則停止從源數據庫中讀取數據。
在另一個具體地實施例中,方法還可包括:判斷數據塊池中的數據量是否到達預設閾值;若是,則停止從源數據庫中讀取數據,直至數據塊池中的數據量小于預設閾值。在這個實施例中,對數據塊池暫存的數據量限制為不能超過預設閾值,一旦超過,則停止從源數據庫中讀取數據。
步驟S205,設置用于鎖定數據塊讀取操作的鎖。
為了避免多個空閑線程同時讀取數據塊而引發(fā)的沖突問題,本實施例設置用于鎖定數據塊讀取操作的鎖。只有搶鎖成功的線程才可從數據塊池中讀取數據塊。
步驟S206,多個線程判斷自身是否處于空閑狀態(tài),判斷為空閑狀態(tài)的線程發(fā)起搶鎖請求。
接收到廣播通知的線程根據自身的工作狀態(tài)選擇是否讀取數據塊。為了提高處理速度,本發(fā)明要求空閑的線程才可從數據塊池中讀取數據塊。因此,當線程接收到廣播通知后,判斷自身是否處于空閑狀態(tài),若是,則發(fā)起搶鎖請求。
步驟S207,搶鎖成功的空閑線程從數據塊池中讀取數據塊。
步驟S208,搶鎖成功的空閑線程從數據塊池中成功讀取一個數據塊之后,對鎖進行釋放處理。
搶鎖成功的空閑線程從數據塊池中成功讀取一個數據塊之后,對鎖進行釋放處理。之前搶鎖失敗的空閑線程可以再次發(fā)起搶鎖請求,再由搶鎖成功的空閑線程從數據塊池中讀取數據塊,如果數據塊池中已沒有數據塊,則空閑線程繼續(xù)等待廣播通知。
步驟S209,搶鎖成功的空閑線程將數據塊寫入目的數據庫。
搶鎖成功的空閑線程將數據塊解析為一條條數據,將數據寫入目的數據塊。具體地,搶鎖成功的空閑線程訪問目的數據庫為其開設的數據寫入端口,向目的數據庫寫入數據。
本實施例提供的數據同步方法適用于MongoDB分布式數據庫系統(tǒng)。MongoDB是一個基于分布式文件存儲的數據庫,由C++語言編寫,旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是面向集合的數據庫系統(tǒng)。所謂面向集合,是指數據被分組存儲在數據集中,被稱為一個集合。每個集合在數據庫中都有一個唯一的標識名,并且可以包含無限數目的文檔。存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用于唯一標識一個文檔,為字符串類型,而值則可以是各種復雜的文件類型。這種存儲形式被稱為BSON(Binary Serialized Document Format)。
本實施例提供的方法不僅可以同步兩個MongoDB(源數據庫和目的數據庫)的所有數據,還可以同步兩個MongoDB的部分數據,例如同步指定集合的數據。中間件在同步過程中,還可以對指定集合的相關字段進行修改,例如對指定集合的命名進行修改。在源數據庫中命名為A的集合,同步給目的數據庫中更名為B,A集合和B集合的數據內容一致。下面以將源數據庫的A集合同步給目的數據庫為例介紹本發(fā)明的實現方案。
首先,中間件與源數據庫建立用于讀取數據的至少一條連接,以及創(chuàng)建多個線程,且每個線程與目的數據庫建立一條用于寫入數據的連接;
中間件從源數據庫中讀取A集合的數據??蛇x地,如果需要對A集合的命名做出更改,則中間件解析出A集合數據的命名字段,將A集合的命名字段進行統(tǒng)一替換,得到B集合;
中間件按照預設塊大小,將B集合數據打包成數據塊;
中間件將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知;
中間件設置用于鎖定數據塊讀取操作的鎖;
多個線程判斷自身是否處于空閑狀態(tài),判斷為空閑狀態(tài)的線程發(fā)起搶鎖請求;
搶鎖成功的空閑線程從數據塊池中讀取數據塊;
搶鎖成功的空閑線程從數據塊池中成功讀取一個數據塊之后,對鎖進行釋放處理。
搶鎖成功的空閑線程將數據塊寫入目的數據庫。
利用本實施例提供的數據同步方法,通過與源數據庫和目的數據庫建立連接,從源數據庫讀取數據之后,將數據打包成數據塊放入數據塊池中;設置用于鎖定數據塊讀取操作的鎖,空閑線程發(fā)起搶鎖請求,搶鎖成功的空閑線程從數據塊池中讀取數據塊,將其寫入目的數據庫。本實施例提供的方法不考慮待同步對象的順序問題。由于數據庫中的數據本身之間無順序,在同步過程中,無需考慮數據之間的順序問題,因此可以采取并行處理的方式,具體通過多個線程執(zhí)行將數據塊寫入目的數據庫的操作,多個線程并行運行,一個線程從數據塊池中讀取一個數據塊后,就執(zhí)行寫入操作,寫入完成空閑后,如果數據塊池中又有新的數據塊,再去讀取并寫入,這種多個線程并行處理的方式大大提高了數據寫入的速度,解決了由于數據寫入的速度遠低于數據讀取的速度而導致的數據寫入占用的時間過長的問題,提升了數據同步效率。另外,通過將數據打包成數據塊,由于數據塊的大小相對固定,使得后續(xù)各個線程處理一個數據塊的時間相差不大,各個線程之間負載相對均衡,優(yōu)化處理性能。進一步的,為了避免數據量超過數據塊池的內存限制,導致數據塊丟失的問題,本發(fā)明對數據塊池暫存的數據塊的數量或數據量進行限制,避免了堵塞引發(fā)的問題。利用鎖機制,避免了多個空閑線程同時讀取數據塊而引發(fā)的沖突問題。本實施例提供的數據同步方法尤其適用于MongoDB分布式數據庫系統(tǒng),不僅可以同步兩個MongoDB的所有數據,還可以同步兩個MongoDB的指定集合的數據。
本實施例的數據同步方法是一種第三方解決方案,具體可利用中間件實現。由于利用了中間件,源數據庫和目的數據庫之間并未直接建立連接,不會改變分布式系統(tǒng)中數據庫之間的連接關系,因而不會觸發(fā)因新建連接而導致的主數據庫選舉機制,也就不會引起因主數據塊選舉機制導致的數據庫性能受影響的問題。
圖3示出了根據本發(fā)明一個實施例的數據同步裝置的功能框圖。如圖3所示,該裝置包括:數據讀取模塊301,打包模塊302,保存模塊303,通知模塊304,以及多個線程處理模塊305。
數據讀取模塊301,適于從源數據庫中讀取數據。
進一步的,數據讀取模塊301還適于:與源數據庫建立用于讀取數據的至少一條連接。
數據讀取模塊301預先與源數據庫建立用于讀取數據的至少一條連接?;跀祿懭氲乃俣冗h低于數據讀取的速度的現狀,數據讀取模塊301與源數據庫之間建立一條用于讀取數據的連接,即可滿足數據同步裝置的處理需求。如果一條連接不能滿足需求,例如數據寫入的速度高于數據讀取的速度,也可以建立兩條及以上用于讀取數據的連接。所謂建立連接具體為源數據庫開設至少一個數據讀取端口,數據讀取模塊301通過訪問該數據讀取端口的方式讀取數據。
打包模塊302,適于將讀取的數據打包成數據塊。由于數據讀取模塊301所讀取的每條數據的數據量比較小,為了增強處理性能,打包模塊302按照預設塊大小,將讀取的數據打包成數據塊,每個數據塊包含若干條數據。數據塊具有預設塊大小,該預設塊大小可根據經驗來設定,本發(fā)明對此不作限制。通過將數據打包成數據塊,由于數據塊的大小相對固定,使得后續(xù)各個線程處理一個數據塊的時間相差不大,各個線程之間負載相對均衡,優(yōu)化處理性能。
保存模塊303,適于將數據塊保存到數據塊池中。
通知模塊304,適于向多個線程處理模塊發(fā)送廣播通知,以通知各個線程有新的數據塊需要寫入。
本發(fā)明中,數據塊池用于暫時存儲數據塊,當多個線程處理模塊的寫數據的速度不如讀數據的速度快時,數據塊池存儲的數據塊有可能越來越多,為了避免數據量超過數據塊池的內存限制,導致數據塊丟失的問題,本發(fā)明對數據塊池暫存的數據塊的數量或數據量進行限制。
數據讀取模塊301還適于:判斷數據塊池中的數據塊的數量是否到達預設數量閾值;若是,則停止從源數據庫中讀取數據,直至數據塊池中的數據塊的數量小于預設數量閾值。
數據讀取模塊301還適于:判斷數據塊池中的數據量是否到達預設閾值;若是,則停止從源數據庫中讀取數據,直至數據塊池中的數據量小于預設閾值。
多個線程處理模塊305,其中處于空閑狀態(tài)的線程處理模塊適于:從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
進一步的,該裝置還包括:創(chuàng)建模塊306,適于創(chuàng)建多個線程處理模塊。
每個線程處理模塊適于:與目的數據庫建立一條用于寫入數據的連接。
每個線程處理模塊與目的數據庫建立一條用于寫入數據的連接。多個線程處理模塊之間為并行處理方式,各個線程處理模塊之間的運行互不干擾。所創(chuàng)建的線程處理模塊的數量可根據實際情況而設定,例如根據需要同步的數據總量,數據同步裝置資源消耗狀況等綜合考慮而設定,本發(fā)明對此不作限制。每個線程處理模塊與目的數據庫建立一條用于寫入數據的連接,具體地,目的數據庫為每個線程處理模塊開設一數據寫入端口,線程處理模塊訪問對應的數據寫入端口寫入數據。
進一步的,該裝置還包括:鎖設置模塊307,適于設置用于鎖定數據塊讀取操作的鎖。為了避免多個空閑線程同時讀取數據塊而引發(fā)的沖突問題,本裝置設置用于鎖定數據塊讀取操作的鎖,只有搶鎖成功的線程處理模塊才可從數據塊池中讀取數據塊。
線程處理模塊305進一步適于:判斷自身是否處于空閑狀態(tài),若是,則發(fā)起搶鎖請求。
其中,搶鎖成功的線程處理模塊進一步適于:從數據塊池中讀取數據塊,將數據塊寫入目的數據庫。
搶鎖成功的線程處理模塊還適于:在從數據塊池中成功讀取一個數據塊之后,對鎖進行釋放處理。
本實施例提供的裝置不僅可以同步兩個MongoDB(源數據庫和目的數據庫)的所有數據,還可以同步兩個MongoDB的部分數據,例如同步指定集合的數據。裝置在同步過程中,還可以對指定集合的相關字段進行修改,例如對指定集合的命名進行修改。在源數據庫中命名為A的集合,同步給目的數據庫中更名為B,A集合和B集合的數據內容一致。下面以將源數據庫的A集合同步給目的數據庫為例介紹本發(fā)明的實現方案。
利用本實施例提供的數據同步裝置,通過與源數據庫和目的數據庫建立連接,從源數據庫讀取數據之后,將數據打包成數據塊放入數據塊池中;設置用于鎖定數據塊讀取操作的鎖,空閑線程發(fā)起搶鎖請求,搶鎖成功的空閑線程從數據塊池中讀取數據塊,將其寫入目的數據庫。本實施例提供的裝置不考慮待同步對象的順序問題。由于數據庫中的數據本身之間無順序,在同步過程中,無需考慮數據之間的順序問題,因此可以采取并行處理的方式,具體通過多個線程處理模塊執(zhí)行將數據塊寫入目的數據庫的操作,多個線程處理模塊并行運行,一個線程處理模塊從數據塊池中讀取一個數據塊后,就執(zhí)行寫入操作,寫入完成空閑后,如果數據塊池中又有新的數據塊,再去讀取并寫入,這種多個線程處理模塊并行處理的方式大大提高了數據寫入的速度,解決了由于數據寫入的速度遠低于數據讀取的速度而導致的數據寫入占用的時間過長的問題,提升了數據同步效率。另外,通過將數據打包成數據塊,由于數據塊的大小相對固定,使得后續(xù)各個線程處理模塊處理一個數據塊的時間相差不大,各個線程處理模塊之間負載相對均衡,優(yōu)化處理性能。進一步的,為了避免數據量超過數據塊池的內存限制,導致數據塊丟失的問題,本發(fā)明對數據塊池暫存的數據塊的數量或數據量進行限制,避免了堵塞引發(fā)的問題。利用鎖機制,避免了多個空閑線程同時讀取數據塊而引發(fā)的沖突問題。本實施例提供的數據同步裝置尤其適用于MongoDB分布式數據庫系統(tǒng),不僅可以同步兩個MongoDB的所有數據,還可以同步兩個MongoDB的指定集合的數據。
在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設備固有相關。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據上面的描述,構造這類系統(tǒng)所要求的結構是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現在此描述的本發(fā)明的內容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。
在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。
類似地,應當理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權利要求書由此明確地并入該具體實施方式,其中每個權利要求本身都作為本發(fā)明的單獨實施例。
本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內并且形成不同的實施例。例如,在下面的權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發(fā)明實施例的數據同步裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現為用于執(zhí)行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發(fā)明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明公開了:A1、一種數據同步方法,其包括:
從源數據庫中讀取數據;
將讀取的數據打包成數據塊;
將數據塊保存到數據塊池中,并向多個線程發(fā)送廣播通知;
接收到廣播通知的空閑線程從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
A2、根據A1所述的方法,其中,在從源數據庫中讀取數據之前,所述方法還包括:與源數據庫建立用于讀取數據的至少一條連接,以及創(chuàng)建所述多個線程,且每個線程與目的數據庫建立一條用于寫入數據的連接。
A3、根據A1所述的方法,其中,所述將讀取的數據打包成數據塊進一步包括:按照預設塊大小,將讀取的數據打包成數據塊。
A4、根據A1所述的方法,其中,在所述向多個線程發(fā)送廣播通知之后,所述方法還包括:
設置用于鎖定數據塊讀取操作的鎖;
所述多個線程判斷自身是否處于空閑狀態(tài),若是,則發(fā)起搶鎖請求;
所述接收到廣播通知的空閑線程從數據塊池中讀取數據塊具體為:搶鎖成功的空閑線程從數據塊池中讀取數據塊。
A5、根據A4所述的方法,其中,在搶鎖成功的空閑線程從數據塊池中成功讀取一個數據塊之后,所述方法還包括:搶鎖成功的空閑線程釋放鎖。
A6、根據A1或A4所述的方法,其中,所述方法還包括:
判斷所述數據塊池中的數據塊的數量是否到達預設數量閾值;
若是,則停止從源數據庫中讀取數據,直至所述數據塊池中的數據塊的數量小于所述預設數量閾值。
A7、根據A1或A4所述的方法,其中,所述方法還包括:
判斷所述數據塊池中的數據量是否到達預設閾值;
若是,則停止從源數據庫中讀取數據,直至所述數據塊池中的數據量小于所述預設閾值。
本發(fā)明公開了:B8、一種數據同步裝置,其包括:
數據讀取模塊,適于從源數據庫中讀取數據;
打包模塊,適于將讀取的數據打包成數據塊;
保存模塊,適于將數據塊保存到數據塊池中;
通知模塊,適于向多個線程處理模塊發(fā)送廣播通知;
多個線程處理模塊,其中處于空閑狀態(tài)的線程處理模塊適于:從數據塊池中讀取數據塊,并將數據塊寫入目的數據庫。
B9、根據B8所述的裝置,其中,所述數據讀取模塊還適于:與源數據庫建立用于讀取數據的至少一條連接;
所述裝置還包括:創(chuàng)建模塊,適于創(chuàng)建多個線程處理模塊;
每個所述線程處理模塊適于:與目的數據庫建立一條用于寫入數據的連接。
B10、根據B8所述的裝置,其中,所述打包模塊具體適于:按照預設塊大小,將讀取的數據打包成數據塊。
B11、根據B8所述的裝置,其中,所述裝置還包括:
鎖設置模塊,適于設置用于鎖定數據塊讀取操作的鎖;
所述線程處理模塊進一步適于:判斷自身是否處于空閑狀態(tài),若是,則發(fā)起搶鎖請求;
其中,搶鎖成功的線程處理模塊進一步適于:從數據塊池中讀取數據塊,將數據塊寫入目的數據庫。
B12、根據B11所述的裝置,其中,所述搶鎖成功的線程處理模塊還適于:在從數據塊池中成功讀取一個數據塊之后,對鎖進行釋放處理。
B13、根據B8或B11所述的裝置,其中,所述數據讀取模塊還適于:判斷所述數據塊池中的數據塊的數量是否到達預設數量閾值;若是,則停止從源數據庫中讀取數據,直至所述數據塊池中的數據塊的數量小于所述預設數量閾值。
B14、根據B8或B11所述的裝置,其中,所述數據讀取模塊還適于:判斷所述數據塊池中的數據量是否到達預設閾值;若是,則停止從源數據庫中讀取數據,直至所述數據塊池中的數據量小于所述預設閾值。