]本發(fā)明實(shí)施例不需要進(jìn)行數(shù)據(jù)遷移,就能夠?qū)崿F(xiàn)異構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)同步,在降低成本的同時減輕了開發(fā)工作量;
[0049]本發(fā)明實(shí)施例彌補(bǔ)了現(xiàn)有的異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步方案中只能針對較成熟的數(shù)據(jù)庫實(shí)現(xiàn),不能針對新的數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)同步的問題;
[0050]本發(fā)明實(shí)施例中異構(gòu)數(shù)據(jù)庫之間的耦合度低,簡化了業(yè)務(wù)程序開發(fā)人員的難度,同時增強(qiáng)了后端存儲的靈活性、穩(wěn)定性及數(shù)據(jù)復(fù)雜處理的能力。
【附圖說明】
[0051]圖1為本發(fā)明實(shí)施例提供的數(shù)據(jù)處理方法的流程示意圖;
[0052]圖2為本發(fā)明實(shí)施例提供的異構(gòu)數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)同步的系統(tǒng)架構(gòu);
[0053]圖3為本發(fā)明實(shí)施例提供的寫數(shù)據(jù)處理方法的流程示意圖;
[0054]圖4為本發(fā)明實(shí)施例提供的讀數(shù)據(jù)處理方法的流程示意圖;
[0055]圖5為本發(fā)明實(shí)施例提供的數(shù)據(jù)處理裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0056]為使本發(fā)明實(shí)施例要解決的技術(shù)問題、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖及具體實(shí)施例進(jìn)行詳細(xì)描述。
[0057]本發(fā)明實(shí)施例提供了一種數(shù)據(jù)處理方法,用于多個數(shù)據(jù)庫,所述多個數(shù)據(jù)庫中至少包括兩個數(shù)據(jù)結(jié)構(gòu)不同的數(shù)據(jù)庫,所述方法如圖1所示,包括:
[0058]步驟11,接收用戶通過應(yīng)用層發(fā)送的請求將第一數(shù)據(jù)寫入所述多個數(shù)據(jù)庫中的至少一個數(shù)據(jù)庫的寫入請求消息,所述寫入請求消息中攜帶所述第一數(shù)據(jù)和所述第一數(shù)據(jù)的第一標(biāo)識;
[0059]步驟12,根據(jù)預(yù)先建立的所述多個數(shù)據(jù)庫與訂閱數(shù)據(jù)的標(biāo)識之間的對應(yīng)關(guān)系,在所述多個數(shù)據(jù)庫中確定與所述第一標(biāo)識對應(yīng)的目標(biāo)數(shù)據(jù)庫;
[0060]步驟13,將所述第一數(shù)據(jù)寫入所述目標(biāo)數(shù)據(jù)庫中。
[0061]在本發(fā)明實(shí)施例提供的方法中,對至少包括兩個數(shù)據(jù)結(jié)構(gòu)不同的數(shù)據(jù)庫的多個數(shù)據(jù)庫(即異構(gòu)數(shù)據(jù)庫),不需要進(jìn)行數(shù)據(jù)遷移,只根據(jù)多個數(shù)據(jù)庫預(yù)先訂閱的標(biāo)識,就能夠在接收到寫入請求消息后,將第一數(shù)據(jù)寫入訂閱了第一數(shù)據(jù)的目標(biāo)數(shù)據(jù)庫中,即在異構(gòu)數(shù)據(jù)庫之間實(shí)現(xiàn)數(shù)據(jù)同步。同時,由于采用本發(fā)明實(shí)施例提供的方法進(jìn)行數(shù)據(jù)同步,不需要購買專門的軟件,因此降低成本,且開發(fā)過程簡單,減輕了開發(fā)工作量。
[0062]對上述過程舉例說明如下。
[0063]〈例子1>
[0064]異構(gòu)數(shù)據(jù)庫中包括MySQL數(shù)據(jù)庫、海量分析系統(tǒng)數(shù)據(jù)庫和智能搜索系統(tǒng)數(shù)據(jù)庫,其中MySQL數(shù)據(jù)庫訂閱了第一標(biāo)識和第二標(biāo)識分別對應(yīng)的數(shù)據(jù),海量分析系統(tǒng)數(shù)據(jù)庫訂閱了第一標(biāo)識和第三標(biāo)識分別對應(yīng)的數(shù)據(jù),智能搜索系統(tǒng)數(shù)據(jù)庫訂閱了第二標(biāo)識和第三標(biāo)識分別對應(yīng)的數(shù)據(jù)。
[0065]當(dāng)接收到寫入請求消息時,該寫入請求消息中攜帶了第一數(shù)據(jù)和第一數(shù)據(jù)的第一標(biāo)識,此時在異構(gòu)數(shù)據(jù)庫中確定目標(biāo)數(shù)據(jù)庫為MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫,將第一數(shù)據(jù)寫入MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫即可。
[0066]可以看出,在將第一數(shù)據(jù)寫入MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫時,已經(jīng)實(shí)現(xiàn)了不同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)庫之間的數(shù)據(jù)同步。
[0067]在上述方法中,優(yōu)選地,步驟13可以通過以下兩種方式實(shí)現(xiàn)。
[0068]< 方式一 >
[0069]步驟13具體為:
[0070]調(diào)用預(yù)先為所述目標(biāo)數(shù)據(jù)庫建立的寫操作接口,將所述寫入請求消息中攜帶的所述第一數(shù)據(jù)寫入所述目標(biāo)數(shù)據(jù)庫中。
[0071]采用這種方式,是在接收到寫入請求消息后,調(diào)用預(yù)先為目標(biāo)數(shù)據(jù)庫中建立的寫操作接口,將寫入請求消息中攜帶的所述第一數(shù)據(jù)主動推送給訂閱第一數(shù)據(jù)的目標(biāo)數(shù)據(jù)庫。舉例說明如下。
[0072]< 例子 2>
[0073]當(dāng)在例子I中已經(jīng)確定目標(biāo)數(shù)據(jù)庫為MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫后,分別調(diào)用預(yù)先建立的MySQL數(shù)據(jù)庫的寫操作接口和海量分析系統(tǒng)數(shù)據(jù)庫的寫操作接口,將第一數(shù)據(jù)主動推送到MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫中。
[0074]可以看出,方式一是接收到寫入請求消息后,就將其中的待寫入數(shù)據(jù)寫入到目標(biāo)數(shù)據(jù)庫中。當(dāng)然,除了上述向目標(biāo)數(shù)據(jù)庫主動推送訂閱的數(shù)據(jù)的方式外,還可以等待目標(biāo)數(shù)據(jù)庫請求相應(yīng)的數(shù)據(jù)時,才將數(shù)據(jù)發(fā)送到目標(biāo)數(shù)據(jù)庫,具體如下。
[0075]< 方式二 >
[0076]步驟13具體包括:
[0077]步驟131,將所述寫入請求消息中攜帶的所述第一數(shù)據(jù)寫入消息隊列中;
[0078]步驟132,在接收所述目標(biāo)數(shù)據(jù)庫發(fā)送的請求與所述第一標(biāo)識對應(yīng)的數(shù)據(jù)的數(shù)據(jù)請求消息后,將所述消息隊列中與所述第一標(biāo)識對應(yīng)的所述第一數(shù)據(jù)寫入所述目標(biāo)數(shù)據(jù)庫中。
[0079]采用方式二是在接收到寫入請求消息時,將其中攜帶的第一數(shù)據(jù)先寫入消息隊列中,等待目標(biāo)數(shù)據(jù)庫發(fā)送請求相應(yīng)數(shù)據(jù)的數(shù)據(jù)請求消息。并在接收到請求消息后,才將數(shù)據(jù)庫訂閱的數(shù)據(jù)發(fā)送到目標(biāo)數(shù)據(jù)庫中。
[0080]其中,寫入數(shù)據(jù)的方法同樣可以通過調(diào)用對應(yīng)地寫操作接口完成,即步驟132具體為:
[0081]在接收所述目標(biāo)數(shù)據(jù)庫發(fā)送的請求與所述第一標(biāo)識對應(yīng)的數(shù)據(jù)的數(shù)據(jù)請求消息后,調(diào)用預(yù)先為所述目標(biāo)數(shù)據(jù)庫建立的寫操作接口,將所述消息隊列中與所述第一標(biāo)識對應(yīng)的所述第一數(shù)據(jù)寫入所述目標(biāo)數(shù)據(jù)庫中。
[0082]對方式二舉例說明如下。
[0083]〈例子3>
[0084]當(dāng)在例子I中已經(jīng)確定目標(biāo)數(shù)據(jù)庫為MySQL數(shù)據(jù)庫和海量分析系統(tǒng)數(shù)據(jù)庫后,不主動推送第一數(shù)據(jù),而是先將第一數(shù)據(jù)寫入消息隊列中,當(dāng)接收到MySQL數(shù)據(jù)庫發(fā)送的數(shù)據(jù)請求消息后,才調(diào)用預(yù)先建立的MySQL數(shù)據(jù)庫的寫操作接口,將第一數(shù)據(jù)主動推送到MySQL數(shù)據(jù)庫中。
[0085]上述的數(shù)據(jù)處理方法中的方式二是將寫入請求消息中攜帶的第一數(shù)據(jù)先寫入一個消息隊列,等待目標(biāo)數(shù)據(jù)庫主動請求數(shù)據(jù)后,才將隊列中的第一數(shù)據(jù)發(fā)送過去。為了避免寫入消息隊列中的數(shù)據(jù)丟失,優(yōu)選地,將所述寫入請求消息中攜帶的所述第一數(shù)據(jù)寫入消息隊列中的同時,所述方法還包括:
[0086]持久化所述第一數(shù)據(jù),使得在接收到用戶通過應(yīng)用層發(fā)送的請求在所述多個數(shù)據(jù)庫中讀取所述第一數(shù)據(jù)的讀取請求消息時,讀取持久化的所述第一數(shù)據(jù),并將所述第一數(shù)據(jù)返回給所述用戶。
[0087]在持久化所述第一數(shù)據(jù)后,當(dāng)用戶通過應(yīng)用層請求第一數(shù)據(jù)時,不再需要根據(jù)用戶請求數(shù)據(jù)的標(biāo)識確定該數(shù)據(jù)所在的數(shù)據(jù)庫,進(jìn)而查詢數(shù)據(jù)庫得到該數(shù)據(jù),可以直接將持久化的第一數(shù)據(jù)返回給用戶,提高讀取數(shù)據(jù)的速度。
[0088]其中,考慮到非關(guān)系型數(shù)據(jù)庫可以處理超大量的數(shù)據(jù)、運(yùn)行在便宜的PC服務(wù)器集群上且沒有過多的操作等優(yōu)點(diǎn),可以將第一數(shù)據(jù)寫入持久化的非關(guān)系型數(shù)據(jù)庫中。即所述持久化所述第一數(shù)據(jù)具體為:
[0089]將所述第一數(shù)據(jù)寫入持久化的非關(guān)系型數(shù)據(jù)庫;
[0090]所述在接收到用戶通過應(yīng)用層發(fā)送的請求在所述多個數(shù)據(jù)庫中讀取所述第一數(shù)據(jù)的讀取請求消息時,讀取持久化的所述第一數(shù)據(jù),并將所述第一數(shù)據(jù)返回給所述用戶具體為:
[0091]在接收到用戶通過應(yīng)用層發(fā)送的請求在所述多個數(shù)據(jù)庫中讀取所述第一數(shù)據(jù)的讀取請求消息時,在所述非關(guān)系型數(shù)據(jù)庫中讀取所述第一數(shù)據(jù),并將所述第一數(shù)據(jù)返回給所述用戶。
[0092]在對異構(gòu)的數(shù)據(jù)庫執(zhí)行讀操作時,雖然從基于持久化的非關(guān)系型數(shù)據(jù)庫中是一定可以讀到數(shù)據(jù)的,但是在本發(fā)明實(shí)施例中,優(yōu)選地,如果從基于持久化的非關(guān)系型數(shù)據(jù)庫中沒讀到數(shù)據(jù),還是要去該數(shù)據(jù)所在的數(shù)據(jù)庫集群里進(jìn)行讀取,即在非關(guān)系型數(shù)據(jù)庫中命不中數(shù)據(jù)的情況下,去MySQL集群中請求數(shù)據(jù)。同時將從MySQL集群中讀取到的數(shù)據(jù)重新寫入消息隊列中,使得消息隊列更新非關(guān)系型數(shù)據(jù)庫,以便執(zhí)行下次讀取操作。
[0093]為了避免重復(fù)向目標(biāo)數(shù)據(jù)庫中寫入數(shù)據(jù),將消息隊列中的所述第一數(shù)據(jù)寫入所述目標(biāo)數(shù)據(jù)庫中之后,所述方法還包括:
[0094]在所述消息隊列中標(biāo)記所述第一數(shù)據(jù)的有效期為過期。
[0095]當(dāng)接收到目標(biāo)數(shù)據(jù)庫發(fā)送的請求數(shù)據(jù)消