張振友 孫燕
摘要:在分布式異構(gòu)數(shù)據(jù)庫中,存在的最大的問題就是異構(gòu)數(shù)據(jù)庫之間的一致性的問題,針對該問題,設(shè)計了一種基于XML的異構(gòu)數(shù)據(jù)庫同步系統(tǒng),該系統(tǒng)以C#/XML為基礎(chǔ),結(jié)合觸發(fā)器法、控制表法和時間戳法獲取變更數(shù)據(jù),并對觸發(fā)器和控制表進行改進,采用XML技術(shù),將得到的變更數(shù)據(jù)轉(zhuǎn)化成XML文檔,通過Web界面實現(xiàn)異構(gòu)數(shù)據(jù)庫之間的同步。
關(guān)鍵詞:數(shù)據(jù)同步;異構(gòu)數(shù)據(jù)庫;C#/XML;Web;變更數(shù)據(jù)捕獲
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2015)28-0016-04
Research and Implement of Distributed Heterogeneous Database Synchronization
ZHANG Zhen-you, SUN Yan
(School of Information Engineering, North China University of Science and Technology, Tangshan 063009, China)
Abstract: In a distributed heterogeneous database, the biggest problem is the problem of consistency between heterogeneous databases, to solve the problem, a XML-based heterogeneous database synchronization system is designed, the system based on C#/XML, combining the trigger method, control table method and the time stamp method to obtain the change data, and improved trigger and control table, the use of XML technology, change data will be converted into an XML document, realized the data synchronization between distributed heterogeneous databases through a Web interface.
Key words: data synchronization; heterogeneous database; C#/XML; Web; change data capture
在進幾十年,計算機技術(shù)在不斷地發(fā)展和進步,各行各業(yè)對于數(shù)據(jù)庫的應(yīng)用變得越來越廣泛,技術(shù)也越來越成熟。由于企業(yè)的規(guī)模不斷擴大,逐漸形成了分布式數(shù)據(jù)庫的局面,因此許多領(lǐng)域當中均涉及異構(gòu)數(shù)據(jù)同步的問題。因此,如何方便、快捷、安全、高效地實現(xiàn)分布式異構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)同步,是各個企業(yè)考慮的重要問題,也是當今信息技術(shù)發(fā)展的一個重要方向。
針對異構(gòu)問題,人們采用了多種方法,如日志法、觸發(fā)器法、API法[1]等。但是這些方法各有優(yōu)缺點,單一的使用此方法難以滿足用戶多方面的需求。為此,本文提出了觸發(fā)器、控制表和時間戳法相結(jié)合的變化捕捉方法,并且采用XML技術(shù)實現(xiàn)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步。采用觸發(fā)器捕獲變更數(shù)據(jù),并對觸發(fā)器算法進行優(yōu)化,為需要同步的數(shù)據(jù)庫創(chuàng)建一個控制表,控制表中設(shè)置時間戳,當觸發(fā)器捕獲到變更數(shù)據(jù)后,將數(shù)據(jù)存放到控制表中。然后將捕獲的變更數(shù)據(jù)轉(zhuǎn)化成XML文檔,通過Web分發(fā)到各個數(shù)據(jù)庫中。在傳送同步數(shù)據(jù)前,刪除重復(fù)無用數(shù)據(jù),傳送最小的數(shù)據(jù),從而降低傳送時間,減少占用帶寬。
1 分布式異構(gòu)數(shù)據(jù)庫與XML技術(shù)
分布式異構(gòu)數(shù)據(jù)庫是數(shù)據(jù)庫技術(shù)與網(wǎng)絡(luò)技術(shù)相結(jié)合的產(chǎn)物,是由多個數(shù)據(jù)庫系統(tǒng)組合而成的,可以實現(xiàn)異構(gòu)數(shù)據(jù)的傳送、共享和透明訪問。這些數(shù)據(jù)庫系統(tǒng)在加入之前是獨立的數(shù)據(jù)庫,能夠?qū)崿F(xiàn)數(shù)據(jù)庫系統(tǒng)的管理。
由于不同的數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)等的定義可能不同,在轉(zhuǎn)換前,需解決的是兩種模型之間存在的各種沖突[2]。XML簡單易懂,具有自描述性,可以采用XML文檔描述存放的是什么數(shù)據(jù),如何存放這些數(shù)據(jù)。XML具有可擴展性和平臺無關(guān)性,并且是純文本文件等特點,能夠有效地解決在異構(gòu)數(shù)據(jù)庫同步時出現(xiàn)的沖突,在數(shù)據(jù)交換中經(jīng)常被使用。
XML文檔與關(guān)系數(shù)據(jù)庫之間的映射有兩種方法:基于模板驅(qū)動的映射和基于模型驅(qū)動的映射[3]。其中基于模板驅(qū)動的映射是在XML文檔中嵌套SQL語句,執(zhí)行得到的結(jié)果。這是一種淺層的映射,只能從關(guān)系數(shù)據(jù)庫到XML文檔的映射?;谀P万?qū)動的映射,是一種深層的映射。數(shù)據(jù)在數(shù)據(jù)庫與XML文檔之間進行轉(zhuǎn)換時,不僅僅是在XML文檔中嵌入SQL語句,而是用一個具體的模型實現(xiàn)的 [4]。
2 系統(tǒng)設(shè)計
本系統(tǒng)目標是對于異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步的關(guān)鍵技術(shù)進行研究,在實驗環(huán)境下進行數(shù)據(jù)同步系統(tǒng)的設(shè)計和實現(xiàn),對系統(tǒng)進行調(diào)試和試運行。主要研究數(shù)據(jù)源數(shù)據(jù)的一致性的解決方案和降低數(shù)據(jù)傳輸時間和提高同步效率。
系統(tǒng)基于B/S模式設(shè)計,采用ADO.net技術(shù)訪問數(shù)據(jù)庫,提供了Connection、Command、DataAdapter、DataReader、DataSet和DataTable等。允許程序員將SQL命令通過驅(qū)動程序發(fā)送給數(shù)據(jù)庫,數(shù)據(jù)庫執(zhí)行后返回數(shù)據(jù)處理結(jié)果。本系統(tǒng)的同步傳輸模型如圖1所示。
2.1 主數(shù)據(jù)庫選取
主數(shù)據(jù)庫是整個系統(tǒng)的中心,在更新操作中,將所有的更新數(shù)據(jù)傳送到主數(shù)據(jù)庫中,主數(shù)據(jù)庫負責對數(shù)據(jù)的分析和處理。由于主數(shù)據(jù)庫需要處理的任務(wù)很大,當不能在短時間內(nèi)完成更新時,可能會得到過期的數(shù)據(jù);并且當主數(shù)據(jù)庫因故障不能夠進行數(shù)據(jù)更新時,系統(tǒng)將無法正常進行,因此采用的是優(yōu)化的中心數(shù)據(jù)庫的方法,先選取異構(gòu)數(shù)據(jù)庫中的一個數(shù)據(jù)庫作為主數(shù)據(jù)庫,當主數(shù)據(jù)庫發(fā)生故障時,在從數(shù)據(jù)庫中選擇一個數(shù)據(jù)相對完整的數(shù)據(jù)庫作為主數(shù)據(jù)庫繼續(xù)處理數(shù)據(jù)。
2.2 數(shù)據(jù)庫表設(shè)計
為了解決命名沖突設(shè)計了數(shù)據(jù)源表、全局表、數(shù)據(jù)源表和全局表映射表。
1)數(shù)據(jù)源信息表
該表中存放了異構(gòu)數(shù)據(jù)庫中的各個數(shù)據(jù)庫的信息,主要用于異構(gòu)數(shù)據(jù)庫注冊。系統(tǒng)的首要任務(wù)是管理可以進行數(shù)據(jù)同步的各個局部數(shù)據(jù)庫的數(shù)據(jù)表,為此,需要將各個節(jié)點的數(shù)據(jù)庫中用戶關(guān)心的連接信息和數(shù)據(jù)庫表的信息集成到全局數(shù)據(jù)庫,全局數(shù)據(jù)庫將這些信息存放全局數(shù)據(jù)庫信息表中,實現(xiàn)局部的異構(gòu)數(shù)據(jù)庫注冊。數(shù)據(jù)源信息表結(jié)構(gòu)如表1所示。
2)全局表
由于各異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)模式是不同的,如果同一個數(shù)據(jù)分別存儲在不同數(shù)據(jù)庫中,那么它的表現(xiàn)形式會不同。所以把各個節(jié)點數(shù)據(jù)庫集成到同步系統(tǒng)中,通過建立全局數(shù)據(jù)庫模式,用戶可以有這樣一種感覺,就是使用一個單一的數(shù)據(jù)庫。全局表如表2所示。
3)映射表
映射表存儲的是全局數(shù)據(jù)庫與局部數(shù)據(jù)庫之間的對應(yīng)關(guān)系。如表3所示。將全局數(shù)據(jù)庫與從數(shù)據(jù)庫中的數(shù)據(jù)通過表進行對應(yīng)。
2.3 變更數(shù)據(jù)捕獲
不同的數(shù)據(jù)庫支持不同的變更數(shù)據(jù)捕獲方法。觸發(fā)器[5]是數(shù)據(jù)庫內(nèi)部的一種機制,它的概念比較明了,對于導(dǎo)致數(shù)據(jù)庫內(nèi)容發(fā)生變化的事件(增加、刪除或者修改),都可以自動采取相關(guān)的動作,通過觸發(fā)器可以直接獲取變更數(shù)據(jù)并且操作簡單,而且現(xiàn)如今常用的數(shù)據(jù)庫都支持觸發(fā)器機制,使用效率很高;控制表法不需要對原有的系統(tǒng)表結(jié)構(gòu)進行修改,但是要為每一個需要同步的表都要創(chuàng)建一個控制表,對于存在大量需要同步的數(shù)據(jù)表的數(shù)據(jù)庫應(yīng)用來說,會占用大量的內(nèi)存空間;時間戳的方法需要在每個進行同步的表上添加一個時間戳,用來記錄修改的時間,以便同步的時候判斷是否為最新數(shù)據(jù)[6]。該方法雖然不會影響應(yīng)用的運行效率,但是需要對原有的系統(tǒng)做非常大的調(diào)整,而且只能捕獲到應(yīng)用程序造成的數(shù)據(jù)的變化。因此,在觸發(fā)器和控制表方法的設(shè)計思想的基礎(chǔ)上,提出了一種改進的用于異構(gòu)數(shù)據(jù)庫同步的變更數(shù)據(jù)捕獲方法——觸發(fā)器法、時間戳法和控制表法相結(jié)合的方法。
該方法需要為每一個系統(tǒng)中的數(shù)據(jù)庫創(chuàng)建一個控制表,控制表中存放的是控制字段,包括數(shù)據(jù)發(fā)生變化的時間、變更數(shù)據(jù)所在的表名、變更數(shù)據(jù)的主鍵值、同步標志等信息,然后對需要進行同步的表創(chuàng)建相應(yīng)操作的觸發(fā)器,當對表進行DML操作時,觸發(fā)器被觸發(fā),將控制信息存放到控制表中。本系統(tǒng)設(shè)計的捕獲數(shù)據(jù)的流程圖如圖2所示。
2.3.1 控制表結(jié)構(gòu)設(shè)計
為了方便提取變更數(shù)據(jù),在整個數(shù)據(jù)庫中為所有需要進行同步的源數(shù)據(jù)庫表只創(chuàng)建了一個控制表Change,用來存放控制信息。當執(zhí)行增刪改等DML操作時,觸發(fā)器監(jiān)測到發(fā)生的變化后,將變更數(shù)據(jù)保存到Change表中。
以SQL Server2008為例,Change表的字段如表4所示。
2.3.2 觸發(fā)器捕獲技術(shù)
不同的數(shù)據(jù)庫系統(tǒng)對于觸發(fā)器的定義是不同的,支持的觸發(fā)器的類型也不相同[7]。其中以SQL server和Oracle的觸發(fā)器為代表。
以SQL Server2008為例,為用戶表UserInfor創(chuàng)建新增觸發(fā)器代碼如下。
create trigger tri_InsertUserInfor on UserInfor
for insert
as begin
insert into change
select getdate(),'','UserInfor',U_Id ,'insert','0' from inserted
end
上述代碼是Insert觸發(fā)器的執(zhí)行過程,說明如下:
1)第一行說明要創(chuàng)建的觸發(fā)器名稱為tri_InsertUserInfor,源表名稱為UserInfor。
2)第二行說明在執(zhí)行insert插入操作時觸發(fā)器觸發(fā)。
3)第四行到第五行定義了觸發(fā)器觸發(fā)時的SQL語句。首先是將數(shù)據(jù)插入到Change表中,對應(yīng)的值分別為當前時間、字段、發(fā)生變化的表名、發(fā)生變化的主鍵值、操作的類型和未同步標識。由于Change表中的主鍵是自增字段,在執(zhí)行insert語句時,不需要指定主鍵。Getdate()是獲取當前系統(tǒng)的時間,將修改的時間存儲到Change表中,實現(xiàn)時間戳的概念。
有一張用戶表,其字段信息如表5所示。
當執(zhí)行Insert語句后,tri_InsertUserInfor捕獲到插入語句,將數(shù)據(jù)存放到Change表中。
Insert語句代碼如下:insert into userinfor values(newid() ,'張春芳','1987-01-10','女','15175500011','河北省唐山市路南區(qū)')
Change表中增加一條數(shù)據(jù)如圖3所示。
2.4 數(shù)據(jù)轉(zhuǎn)換
由于異構(gòu)數(shù)據(jù)庫間的功能屬性和結(jié)構(gòu)不同,可能采用了不同的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型等。因此,在數(shù)據(jù)捕獲后,需要針對這些差異,對數(shù)據(jù)進行轉(zhuǎn)換。針對這些差異性,基于XML技術(shù),聲明源數(shù)據(jù)庫與目標數(shù)據(jù)庫之間的異構(gòu)[8],以便實現(xiàn)數(shù)據(jù)轉(zhuǎn)換。
2.4.1 關(guān)系數(shù)據(jù)庫到XML文檔的轉(zhuǎn)換
實現(xiàn)關(guān)系數(shù)據(jù)庫到XML文檔映射的過程分為兩步:一是對數(shù)據(jù)庫中的數(shù)據(jù)的提??;二是通過XML Schema編寫函數(shù),將提取的數(shù)據(jù)通過寫入文檔的函數(shù)方法寫入XML文檔中。
1)提取數(shù)據(jù)庫的數(shù)據(jù)
異構(gòu)數(shù)據(jù)庫同步對變更數(shù)據(jù)的操作是根據(jù)控制表中的C_Operate字段的值來確定的,在實際的應(yīng)用中,對需同步的表的操作可能存在插入、刪除、更新三種情況,這三種對應(yīng)的SQL語句結(jié)構(gòu)都不相同。實現(xiàn)控制表中的控制信息的提取,文中概括了三種情況。
① 插入操作
在執(zhí)行插入操作時,需要所有的字段對應(yīng)值,因此在生成XML文檔時需要將每個數(shù)據(jù)都插入。因為控制表中只存放控制信息,沒有數(shù)據(jù),需要將控制表與源表聯(lián)立,獲取數(shù)據(jù)信息。
提取同步數(shù)據(jù)代碼如下:select a.* from userInfor a, change b where a.U_ID = b.C_Key and b.C_Operate='insert'
通過聯(lián)立UserInfor表和Change表,將用戶信息表中的每個字段作為一個節(jié)點名稱,每個字段對應(yīng)的值作為節(jié)點值,再從Change表中獲取四個控制節(jié)點記錄信息,控制節(jié)點的作用是根據(jù)源表信息在文件中找到對應(yīng)的目標表的信息,從而達到同步的效果。其中一條插入數(shù)據(jù)操作最終生成的XML文檔如下:
其中
Username、Birthday、Gender、Telephone、Address分別對應(yīng)同步數(shù)據(jù)表中相應(yīng)的字段,保存變化的數(shù)據(jù)。
C_Operate用來記錄本次數(shù)據(jù)變化的操作類型,如insert、delete和update。
C_Table用來記錄本次操作的表名。
DBName用來記錄操作的數(shù)據(jù)庫名。
DBType用來記錄操作的數(shù)據(jù)庫類型。
② 更新操作
更新操作與插入操作類似。更新包括主鍵更新和非主鍵更新。上面介紹的控制表中有個字段C_Field,該字段的作用是存放主鍵更新操作時的更新前的主鍵值。
③ 刪除操作
刪除操作很簡單,通常一條刪除語句可以通過主鍵的唯一性即可刪除一條記錄,所以在設(shè)計XML文檔時,可以直接將Change表中讀取C_Key字段,不再需要和源表UserInfor關(guān)聯(lián)。
2)將關(guān)系模式映射為XML Schema
將關(guān)系數(shù)據(jù)庫中的關(guān)系模式映射為對應(yīng)的XML Schema,為XML文檔提供描述標準。程序中關(guān)系模式映射為XML Schema的主要代碼[9]如下:
//創(chuàng)建新數(shù)據(jù)集
DataSet ds = new DataSet("XML");
//連接數(shù)據(jù)源
DbConnection conn = DBHelper.GetConn();
conn.Open();
string sql = "select * from userInfor";
//生成數(shù)據(jù)適配器
DbDataAdapter adapter_index = DBHelper.GetAdp(sql,conn);
//用適配器填充數(shù)據(jù)集
adapter_index.Fill(ds, "userInfor");
//在數(shù)據(jù)集中添加表與表之間的關(guān)系
ds.Relations.Add(……)
//生成XML文件
ds.WriteXml("..\\..\\userinforschema.xml", XmlWriteMode.WriteSchema);
2.4.2 XML文檔到關(guān)系數(shù)據(jù)庫的轉(zhuǎn)換
該模塊的功能是將源數(shù)據(jù)庫中發(fā)來的XML文檔解析成SQL語句,然后在目標數(shù)據(jù)庫中執(zhí)行,采用Linq to XML 操作XML文件。通過XElement類讀取XML文件,使用XElement類中提供的Element和Elements方法定位到某個或某些元素,XAttribute類中提供的Attribute和Attributes方法定位到某個或某些屬性,將XML中的元素和屬性提取出來,還原SQL語句,連接目標數(shù)據(jù)庫后執(zhí)行,將變化數(shù)據(jù)反映到目標數(shù)據(jù)庫當中。
public decryptXMLFile(string filePath)
{
publi XElement xmlDoc = XElement.Load(filePath);//通過文件路徑加載XML文件
IEnumerable
…
}
3 結(jié)論
系統(tǒng)采用改進的基于觸發(fā)器、控制表和時間戳的變更數(shù)據(jù)捕獲方法和基于XML框架解決了多個異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步的問題,通過測試和使用,該方案的可靠性和穩(wěn)定性得到了證明。該方案實用性強,實現(xiàn)了數(shù)據(jù)的共享和交換功能。
參考文獻:
[1] 林源,陳志泊.分布式異構(gòu)數(shù)據(jù)庫同步系統(tǒng)的研究與應(yīng)用[J].計算機工程與設(shè)計,2010,31(24):5278-5281.
[2] 申毅,武小年.分布式異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步系統(tǒng)的實現(xiàn)與優(yōu)化[J].桂林電子科技大學(xué)學(xué)報,2014,34(4):285-289.
[3] 王玉標,饒錫如,何盼.異構(gòu)環(huán)境下數(shù)據(jù)庫增量同步更新機制[J].計算機工程與設(shè)計,2011(11):948-951.
[4] 楊鵬,楊海濤,王正華.異構(gòu)數(shù)據(jù)庫變化捕捉及同步策略[J].計算機工程,2008,34(16):53-55.
[5] 王軍.基于XML的分布式異構(gòu)數(shù)據(jù)庫同步研究與設(shè)計[D].南昌大學(xué),2007:11-13.
[6] 沈敏,許華虎,季永華,等.基于XML的分布式異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步系統(tǒng)的研究[D].計算機工程與應(yīng)用,2005(5):2-5.
[7] 李佩.基于XML的異構(gòu)數(shù)據(jù)庫同步技術(shù)研究[D].曲阜師范大學(xué),2010:5-12.
[8] 方煥.基于XML的分布式異構(gòu)數(shù)據(jù)庫同步系統(tǒng)設(shè)計與實現(xiàn)[J].廣西通信技術(shù),2014(4):21-25.
[9] 戴婉榮.基于分布式數(shù)據(jù)庫的數(shù)據(jù)同步機制的研究與應(yīng)用[D].武漢:武漢理工大學(xué),2010:45-47.