本發(fā)明涉及數(shù)據(jù)庫的數(shù)據(jù)同步方法,更具體地是涉及基于springjdbc的可配置化的異構(gòu)關(guān)系型數(shù)據(jù)庫單向同步方法。
背景技術(shù):
關(guān)于數(shù)據(jù)庫同步,各大數(shù)據(jù)庫廠商均有其專用產(chǎn)品。如oracle的dataguard、goldengate。但它們主要應(yīng)用于數(shù)據(jù)庫表結(jié)構(gòu)數(shù)據(jù)一致的情形。不能實(shí)現(xiàn)不同表結(jié)構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)同步。通常的代碼實(shí)現(xiàn)往往與業(yè)務(wù)邏輯掛鉤,不具備通用性和靈活性。
在企業(yè)應(yīng)用中,經(jīng)常存在著一份基礎(chǔ)數(shù)據(jù)被不同系統(tǒng)使用的情形。如果各個(gè)系統(tǒng)都需要對(duì)這些基礎(chǔ)數(shù)據(jù)進(jìn)行維護(hù),那么維護(hù)的工作量將會(huì)變得十分沉重,且數(shù)據(jù)的一致性難以得到保障。為了減輕維護(hù)工作量及保障數(shù)據(jù)一致性,往往需要以某個(gè)庫數(shù)據(jù)為準(zhǔn),其它數(shù)據(jù)庫如共享該基礎(chǔ)數(shù)據(jù),則將該部分?jǐn)?shù)據(jù)同步過去。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,本發(fā)明提出一種只需要進(jìn)行簡單配置就能夠?qū)崿F(xiàn)不同類型數(shù)據(jù)庫、不同結(jié)構(gòu)表數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法。
本發(fā)明的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法,其特征在于,該方法包括下述步驟:
源數(shù)據(jù)庫查詢步驟:查詢出源數(shù)據(jù)庫中的待同步數(shù)據(jù);
第一記錄比較步驟:檢查待同步記錄在目標(biāo)數(shù)據(jù)庫中是否存在,根據(jù)檢查結(jié)果進(jìn)行更新操作、或者插入操作或者不進(jìn)行同步操作;
目標(biāo)數(shù)據(jù)庫查詢步驟:查詢出目標(biāo)數(shù)據(jù)庫中的現(xiàn)有數(shù)據(jù);以及
第二記錄比較步驟:檢查目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)在源數(shù)據(jù)庫中是否存在,根據(jù)檢查結(jié)果進(jìn)行刪除該記錄或者標(biāo)柱該記錄或者不進(jìn)行同步操作。
優(yōu)選地,將源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫中的每一行記錄映射成一個(gè)map對(duì)象。
優(yōu)選地,將源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫的數(shù)據(jù)庫表字段作為所述map對(duì)象的key,將該行中表字段的值作為相應(yīng)key的value。
優(yōu)選地,在所述源數(shù)據(jù)庫查詢步驟中,根據(jù)“源庫待同步表表名”、“源表待同步字段”查詢出源數(shù)據(jù)庫中的待同步數(shù)據(jù),其中,“源庫待同步表表名”、“源表待同步字段”為可配置參數(shù)。
優(yōu)選地,在所述第一記錄比較步驟中包括下述子步驟:
遍歷源數(shù)據(jù)庫待同步數(shù)據(jù)記錄,根據(jù)“源表記錄唯一標(biāo)識(shí)字段”的值在目標(biāo)數(shù)據(jù)庫中查詢“目標(biāo)表記錄唯一標(biāo)識(shí)字段”具有相同的值的記錄;
如果在目標(biāo)數(shù)據(jù)庫中存在該記錄,則比較“目標(biāo)表待同步字段”的值和“源表待同步字段”的值是否一致;
如果目標(biāo)數(shù)據(jù)庫存在該記錄并且與源數(shù)據(jù)庫中的該記錄一致,則不需要執(zhí)行同步操作,如果存在該記錄但不完全一致,則根據(jù)源數(shù)據(jù)庫進(jìn)行目標(biāo)數(shù)據(jù)庫的更新操作,如果不存在該記錄,則根據(jù)規(guī)定同步方式將源數(shù)據(jù)庫中的該記錄更新到目標(biāo)數(shù)據(jù)庫。
優(yōu)選地,所述規(guī)定同步方式包括下述方式之一:
存量更新、增量更新、強(qiáng)同步、弱同步。
優(yōu)選地,所述第二記錄比較步驟中包括下述子步驟:
查詢目標(biāo)數(shù)據(jù)庫中的目標(biāo)表數(shù)據(jù);
查詢?cè)磾?shù)據(jù)庫中的源表數(shù)據(jù);
比較兩者之間的差異,其中,如果源表中存在該記錄,則不進(jìn)行任何操作,如果在源表中不存在該記錄則在目標(biāo)表中刪除該數(shù)據(jù)或者對(duì)該記錄進(jìn)行標(biāo)注。
優(yōu)選地,在查詢目標(biāo)數(shù)據(jù)庫中的目標(biāo)表數(shù)據(jù)的子步驟中,根據(jù)“目標(biāo)表名”、“目標(biāo)表記錄唯一標(biāo)識(shí)字段”查詢出目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)記錄。
優(yōu)選地,在查詢?cè)磾?shù)據(jù)庫中的源表數(shù)據(jù)的子步驟中,遍歷目標(biāo)表各數(shù)據(jù)記錄,根據(jù)記錄的“目標(biāo)表記錄唯一標(biāo)識(shí)字段”的值,在源表中查詢“源表記錄唯一標(biāo)識(shí)字段”具有相同值的記錄。
優(yōu)選地,在比較兩者之間的差異的子步驟中,如果源表中存在該記錄,則不進(jìn)行任何操作,如果在源表中不存在該記錄的情況下,若所述規(guī)定同步方式為強(qiáng)同步,則刪除該記錄,若所述規(guī)定同步方式為弱同步,則更新目標(biāo)表中該記錄的“目標(biāo)表標(biāo)記字段”狀態(tài)為刪除狀態(tài)。
如上所述,在本發(fā)明中,通過將數(shù)據(jù)庫的每一行記錄映射成一個(gè)map對(duì)象,表字段將作為該map對(duì)象的key,該行記錄中表字段對(duì)應(yīng)的值作為相應(yīng)key的value,數(shù)據(jù)庫的多行記錄映射為一個(gè)map對(duì)象的集合。這樣,無論是怎樣的表數(shù)據(jù)都可以用同樣的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ),由此,能夠?qū)⑼讲僮髋c表結(jié)構(gòu)解耦,也就是能夠與具體的業(yè)務(wù)解耦。而且,通過將目標(biāo)庫數(shù)據(jù)庫連接參數(shù)、源庫數(shù)據(jù)庫連接參數(shù)、目標(biāo)數(shù)據(jù)庫待同步表表名、源數(shù)據(jù)庫待同步表表名、目標(biāo)表待同步字段、源表待同步字段、目標(biāo)表和源表待同步字段映射關(guān)系、目標(biāo)表記錄唯一標(biāo)識(shí)字段、源表記錄唯一標(biāo)識(shí)段、數(shù)據(jù)同步方式以及目標(biāo)數(shù)據(jù)庫標(biāo)記字段設(shè)置為可配置項(xiàng),通過簡單配置就能夠?qū)崿F(xiàn)不同類型數(shù)據(jù)庫、不同結(jié)構(gòu)表數(shù)據(jù)間的單向數(shù)據(jù)同步。
附圖說明
圖1表示了本發(fā)明中的用于實(shí)現(xiàn)數(shù)據(jù)庫記錄的映射的map的示意圖。
圖2是表示本發(fā)明的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法的流程圖。
圖3是表示本發(fā)明一實(shí)施例的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法的示意圖。
具體實(shí)施方式
下面介紹的是本發(fā)明的多個(gè)實(shí)施例中的一些,旨在提供對(duì)本發(fā)明的基本了解。并不旨在確認(rèn)本發(fā)明的關(guān)鍵或決定性的要素或限定所要保護(hù)的范圍。
首先,在本發(fā)明中,采用jdbc技術(shù)作為數(shù)據(jù)庫訪問技術(shù)。jdbc能夠支持常用數(shù)據(jù)庫類型,屏蔽底層數(shù)據(jù)庫差異,提供統(tǒng)一的數(shù)據(jù)庫訪問接口。具體地,jdbc是一種用于執(zhí)行sql語句的javaapi可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用java語言編寫的類和接口組成。jdbc提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。其中,jdbc為javadatabaseconnectivity,java數(shù)據(jù)庫連接;sql為structuredquerylanguage結(jié)構(gòu)化查詢語言;api為applicationprogramminginterface,應(yīng)用程序編程接口。jdbc技術(shù)的有關(guān)介紹還可參見:
http://www.oracle.com/technetwork/java/javase/jdbc/index.html。
另外,下文中還將提到的springjdbc技術(shù)的有關(guān)介紹可以參見:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html。
在本發(fā)明中,把要實(shí)施數(shù)據(jù)同步的數(shù)據(jù)庫視為目標(biāo)數(shù)據(jù)庫,把提供數(shù)據(jù)來源的數(shù)據(jù)庫視為源數(shù)據(jù)庫,并且用jdbc技術(shù)建立到兩個(gè)數(shù)據(jù)庫的連接。
其次,實(shí)現(xiàn)同步必然要查詢出目標(biāo)數(shù)據(jù)庫和源數(shù)據(jù)庫的數(shù)據(jù)記錄,比對(duì)記錄之間的差異并進(jìn)行相應(yīng)的處理。如果采用面向?qū)ο蟮臄?shù)據(jù)庫訪問框架,因?yàn)楸碛涗泴⒈挥成錇橄鄳?yīng)的對(duì)象,則同步的實(shí)現(xiàn)與具體業(yè)務(wù)相耦合,無法滿足通用性的原則。如果使用原生jdbc,表數(shù)據(jù)被封存在resultset中,雖然resultset也是一種通用的數(shù)據(jù)對(duì)象,但其操作起來繁瑣。但是,在本發(fā)明中采用了另一種通用的數(shù)據(jù)對(duì)象:map,用于實(shí)現(xiàn)與數(shù)據(jù)庫記錄的映射。
圖1表示了本發(fā)明中的用于實(shí)現(xiàn)數(shù)據(jù)庫記錄的映射的map的示意圖。
如圖1所示,數(shù)據(jù)庫的每一行記錄映射成一個(gè)map對(duì)象,表字段將作為該map對(duì)象的key,該行記錄中表字段對(duì)應(yīng)的值作為相應(yīng)key(即密鑰)的value(即值)。而數(shù)據(jù)庫的多行記錄映射為一個(gè)map對(duì)象的集合。這樣,無論是怎樣的表數(shù)據(jù)都可以用同樣的數(shù)據(jù)結(jié)構(gòu)(map或者map的集合)來存儲(chǔ),從而將同步操作與表結(jié)構(gòu)解耦,也就是能夠與具體的業(yè)務(wù)解耦。
springjdbc是基于jdbc技術(shù)的封裝,可以方便的將數(shù)據(jù)庫查詢結(jié)果封裝為map對(duì)象及map對(duì)象的集合,故在本發(fā)明中采用了springjdbc來簡化對(duì)數(shù)據(jù)庫操作。它主要協(xié)助完成三項(xiàng)工作:1.讀取源數(shù)據(jù)庫表數(shù)據(jù);2.讀取目標(biāo)數(shù)據(jù)庫表數(shù)據(jù);3.更新目標(biāo)數(shù)據(jù)庫。
最后,是對(duì)同步過程的抽象。通常的實(shí)現(xiàn)方式是,同步操作通常被固化在代碼中。為了實(shí)現(xiàn)通用性,在本發(fā)明中設(shè)計(jì)了同步實(shí)現(xiàn)的邏輯(即同步方法的流程)并提取出同步過程中的關(guān)鍵點(diǎn),將其抽取并作為可配置參數(shù),從而實(shí)現(xiàn)了同步操作的可配置化。
圖2是表示本發(fā)明的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法的流程圖。
如圖2所示,本發(fā)明的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法包括下述步驟:
步驟s100:源數(shù)據(jù)庫查詢步驟,用于查詢出源數(shù)據(jù)庫中的待同步數(shù)據(jù);
步驟s200:第一記錄比較步驟,用于檢查待同步記錄在目標(biāo)數(shù)據(jù)庫中是否存在,如存在且完全一致,則不需進(jìn)行操作;如存在但不完全一致,則根據(jù)源數(shù)據(jù)庫進(jìn)行目標(biāo)數(shù)據(jù)庫更新操作;如果不存在則執(zhí)行插入操作(將同步記錄插入到目標(biāo)數(shù)據(jù)庫中);
步驟s300:目標(biāo)數(shù)據(jù)庫查詢步驟,用于查詢出目標(biāo)數(shù)據(jù)庫中的現(xiàn)有數(shù)據(jù);以及
步驟s400:第一記錄比較步驟,用于檢查目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)在源數(shù)據(jù)庫中是否存在,如存在則不需操作,如不存在則刪除目標(biāo)數(shù)據(jù)庫中該數(shù)據(jù),或者對(duì)該記錄進(jìn)行標(biāo)注。
在本發(fā)明中,可配置的關(guān)鍵參數(shù)有下列參數(shù):
(1)目標(biāo)庫數(shù)據(jù)庫連接參數(shù):
用于定位目標(biāo)數(shù)據(jù)庫。
(2)源庫數(shù)據(jù)庫連接參數(shù):
用于定位源數(shù)據(jù)庫。
(3)目標(biāo)數(shù)據(jù)庫待同步表表名:
用于定位目標(biāo)數(shù)據(jù)庫的目標(biāo)表。
(4)源數(shù)據(jù)庫待同步表表名:
用于定位源數(shù)據(jù)庫中的源表。
(5)目標(biāo)表待同步字段:
用于定位目標(biāo)表中需要更新的表字段。
(6)源表待同步字段:
用于查詢?cè)幢碇写綌?shù)據(jù)所在表字段。
(7)目標(biāo)表、源表待同步字段映射關(guān)系:
用于判斷如何將源表中各個(gè)字段的值更新或插入目標(biāo)表中的相應(yīng)字段。
(8)目標(biāo)表記錄唯一標(biāo)識(shí)字段和源表記錄唯一標(biāo)識(shí)段:
源表記錄唯一標(biāo)識(shí)段與目標(biāo)表記錄唯一標(biāo)識(shí)字段一起,用于判斷源表記錄在目標(biāo)表中是否存在,以及判斷目標(biāo)表記錄在源表中是否存在。
(9)數(shù)據(jù)同步方式:
數(shù)據(jù)同步方式主要定義有存量更新、增量更新、強(qiáng)同步、弱同步四種方式:
存量更新指僅僅對(duì)目標(biāo)表中已有的記錄執(zhí)行更新,為默認(rèn)的同步模式;
增量更新指對(duì)于目標(biāo)表中已有記錄做更新,對(duì)于源表有而目標(biāo)表中沒有的記錄執(zhí)行插入操作;
強(qiáng)同步指對(duì)于目標(biāo)表中已有記錄做更新,對(duì)于源表有而目標(biāo)表中沒有的記錄執(zhí)行插入操作,對(duì)于源表中沒有而目標(biāo)表中有的記錄執(zhí)行刪除操作;
弱同步指對(duì)于目標(biāo)表中已有記錄做更新,對(duì)于源表有而目標(biāo)表中沒有的記錄執(zhí)行插入操作,對(duì)于源表中沒有而目標(biāo)表中有的記錄執(zhí)行標(biāo)記操作。
(10)目標(biāo)數(shù)據(jù)庫標(biāo)記字段:
非必需參數(shù),只在“弱同步”模式下被使用。
在本發(fā)明中,數(shù)據(jù)庫連接的屬性(即目標(biāo)庫數(shù)據(jù)庫連接參數(shù)和源庫數(shù)據(jù)庫連接參數(shù))設(shè)置為可配置項(xiàng),因此,在本發(fā)明中可以支持異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)同步。而且,將目標(biāo)數(shù)據(jù)庫待同步表名、待同步字段及源表待同步表名、待同步字段均設(shè)置為可配置參數(shù),則是的在本發(fā)明中進(jìn)行數(shù)據(jù)同步時(shí)可以針對(duì)數(shù)據(jù)庫的不同數(shù)據(jù)表進(jìn)行,而且,同步的表字段也不必相同。
下面,對(duì)于本發(fā)明一實(shí)施例的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法進(jìn)行說明。
圖3是表示本發(fā)明一實(shí)施例的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法的示意圖。
如圖3所示,步驟1:查詢?cè)磾?shù)據(jù)庫的待同步數(shù)據(jù)。
具體地,依據(jù)“目標(biāo)數(shù)據(jù)庫待同步表表名”、“源表待同步字段”查詢出源數(shù)據(jù)庫中的待同步數(shù)據(jù)記錄。例如在圖3中按照“目標(biāo)數(shù)據(jù)庫待同步表表名”查新到源表1、源表2。
步驟2:查詢目標(biāo)數(shù)據(jù)庫,以檢查待同步數(shù)據(jù)記錄在目標(biāo)數(shù)據(jù)庫中是否存在。
具體地,如圖3所示,按照“目標(biāo)數(shù)據(jù)庫待同步表表名”查詢到目標(biāo)表1、目標(biāo)表2。逐條遍歷源表1、2中的待同步數(shù)據(jù)記錄,根據(jù)記錄的“源表記錄唯一標(biāo)識(shí)字段”的值,在“目標(biāo)表1、目標(biāo)表2”中查詢“目標(biāo)表記錄唯一標(biāo)識(shí)字段”具有相同值的記錄。
步驟3:比較表記錄差異。
如果目標(biāo)表存在該記錄,則比較目標(biāo)表和源表的記錄的“目標(biāo)表待同步字段”的值和“源表待同步字段”的值是否一致。
步驟4:更新目標(biāo)表數(shù)據(jù)。
如果目標(biāo)表存在該記錄,且與源表記錄一致,則不需要執(zhí)行同步操作;
如果目標(biāo)表存在該記錄,但與源表記錄不一致,則依據(jù)“目標(biāo)表、源表待同步字段映射關(guān)系”將源表記錄的數(shù)據(jù)更新到目標(biāo)表記錄;
如果目標(biāo)表不存在該記錄,則根據(jù)“同步方式”取值,在“增量更新”、“強(qiáng)同步”、“弱同步”模式下執(zhí)行數(shù)據(jù)插入操作。
然后,在本實(shí)施例中,根據(jù)“同步方式”取值,在“強(qiáng)同步”、“弱同步”模式下繼續(xù)后續(xù)操作,具體步驟如下所示在(其中,步驟5~步驟8在附圖中沒有表示):
步驟5:查詢目標(biāo)表數(shù)據(jù)。
具體地,依據(jù)“目標(biāo)表名”、“目標(biāo)表記錄唯一標(biāo)識(shí)字段”查詢出目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)記錄。
步驟6:查詢?cè)幢頂?shù)據(jù)。
具體地,逐條遍歷目標(biāo)表各數(shù)據(jù)記錄,根據(jù)記錄“目標(biāo)表記錄唯一標(biāo)識(shí)字段”的值,在“源表”中查詢“源表記錄唯一標(biāo)識(shí)字段”具有相同值的記錄。
步驟7:比較表記錄差異。
步驟8:更新目標(biāo)表數(shù)據(jù)。
具體地,如果源表中存在該記錄,則不進(jìn)行任何操作;如果不存在該記錄,則根據(jù)“同步方式”取值,在“強(qiáng)同步”模式下刪除該記錄;在“弱同步”模式下更新目標(biāo)表中該記錄的“目標(biāo)表標(biāo)記字段”狀態(tài)為刪除狀態(tài)。
在本發(fā)明中,如上所述,第一個(gè)方面,通過將數(shù)據(jù)庫的每一行記錄映射成一個(gè)map對(duì)象,表字段將作為該map對(duì)象的key,該行記錄中表字段對(duì)應(yīng)的值作為相應(yīng)key的value,數(shù)據(jù)庫的多行記錄映射為一個(gè)map對(duì)象的集合。這樣,無論是怎樣的表數(shù)據(jù)都可以用同樣的數(shù)據(jù)結(jié)構(gòu)(map或者map的集合)來存儲(chǔ),由此,能夠?qū)⑼讲僮髋c表結(jié)構(gòu)解耦,也就是能夠與具體的業(yè)務(wù)解耦。
第二個(gè)方面,通過將目標(biāo)庫數(shù)據(jù)庫連接參數(shù)、源庫數(shù)據(jù)庫連接參數(shù)、目標(biāo)數(shù)據(jù)庫待同步表表名、源數(shù)據(jù)庫待同步表表名、目標(biāo)表待同步字段、源表待同步字段、目標(biāo)表和源表待同步字段映射關(guān)系、目標(biāo)表記錄唯一標(biāo)識(shí)字段、源表記錄唯一標(biāo)識(shí)段、數(shù)據(jù)同步方式以及目標(biāo)數(shù)據(jù)庫標(biāo)記字段設(shè)置為可配置項(xiàng),通過簡單配置就能夠?qū)崿F(xiàn)不同類型數(shù)據(jù)庫、不同結(jié)構(gòu)表數(shù)據(jù)間的單向數(shù)據(jù)同步。
以上例子主要說明了本發(fā)明的數(shù)據(jù)庫間的數(shù)據(jù)庫單向同步方法。盡管只對(duì)其中一些本發(fā)明的具體實(shí)施方式進(jìn)行了描述,但是本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)了解,本發(fā)明可以在不偏離其主旨與范圍內(nèi)以許多其他的形式實(shí)施。因此,所展示的例子與實(shí)施方式被視為示意性的而非限制性的,在不脫離如所附各權(quán)利要求所定義的本發(fā)明精神及范圍的情況下,本發(fā)明可能涵蓋各種的修改與替換。