張振友 孫燕
摘要:在分布式異構(gòu)數(shù)據(jù)庫中,存在的最大的問題就是異構(gòu)數(shù)據(jù)庫之間的一致性的問題,針對該問題,設(shè)計(jì)了一種基于XML的異構(gòu)數(shù)據(jù)庫同步系統(tǒng),該系統(tǒng)以C#/XML為基礎(chǔ),結(jié)合觸發(fā)器法、控制表法和時(shí)間戳法獲取變更數(shù)據(jù),并對觸發(fā)器和控制表進(jìn)行改進(jìn),采用XML技術(shù),將得到的變更數(shù)據(jù)轉(zhuǎn)化成XML文檔,通過Web界面實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫之間的同步。
關(guān)鍵詞:數(shù)據(jù)同步;異構(gòu)數(shù)據(jù)庫;C#/XML;Web;變更數(shù)據(jù)捕獲
中圖分類號:TP393 文獻(xiàn)標(biāo)識(shí)碼: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
在進(jìn)幾十年,計(jì)算機(jī)技術(shù)在不斷地發(fā)展和進(jìn)步,各行各業(yè)對于數(shù)據(jù)庫的應(yīng)用變得越來越廣泛,技術(shù)也越來越成熟。由于企業(yè)的規(guī)模不斷擴(kuò)大,逐漸形成了分布式數(shù)據(jù)庫的局面,因此許多領(lǐng)域當(dāng)中均涉及異構(gòu)數(shù)據(jù)同步的問題。因此,如何方便、快捷、安全、高效地實(shí)現(xiàn)分布式異構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)同步,是各個(gè)企業(yè)考慮的重要問題,也是當(dāng)今信息技術(shù)發(fā)展的一個(gè)重要方向。
針對異構(gòu)問題,人們采用了多種方法,如日志法、觸發(fā)器法、API法[1]等。但是這些方法各有優(yōu)缺點(diǎn),單一的使用此方法難以滿足用戶多方面的需求。為此,本文提出了觸發(fā)器、控制表和時(shí)間戳法相結(jié)合的變化捕捉方法,并且采用XML技術(shù)實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步。采用觸發(fā)器捕獲變更數(shù)據(jù),并對觸發(fā)器算法進(jìn)行優(yōu)化,為需要同步的數(shù)據(jù)庫創(chuàng)建一個(gè)控制表,控制表中設(shè)置時(shí)間戳,當(dāng)觸發(fā)器捕獲到變更數(shù)據(jù)后,將數(shù)據(jù)存放到控制表中。然后將捕獲的變更數(shù)據(jù)轉(zhuǎn)化成XML文檔,通過Web分發(fā)到各個(gè)數(shù)據(jù)庫中。在傳送同步數(shù)據(jù)前,刪除重復(fù)無用數(shù)據(jù),傳送最小的數(shù)據(jù),從而降低傳送時(shí)間,減少占用帶寬。
1 分布式異構(gòu)數(shù)據(jù)庫與XML技術(shù)
分布式異構(gòu)數(shù)據(jù)庫是數(shù)據(jù)庫技術(shù)與網(wǎng)絡(luò)技術(shù)相結(jié)合的產(chǎn)物,是由多個(gè)數(shù)據(jù)庫系統(tǒng)組合而成的,可以實(shí)現(xiàn)異構(gòu)數(shù)據(jù)的傳送、共享和透明訪問。這些數(shù)據(jù)庫系統(tǒng)在加入之前是獨(dú)立的數(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具有可擴(kuò)展性和平臺(tái)無關(guān)性,并且是純文本文件等特點(diǎn),能夠有效地解決在異構(gòu)數(shù)據(jù)庫同步時(shí)出現(xiàn)的沖突,在數(shù)據(jù)交換中經(jīng)常被使用。
XML文檔與關(guān)系數(shù)據(jù)庫之間的映射有兩種方法:基于模板驅(qū)動(dòng)的映射和基于模型驅(qū)動(dòng)的映射[3]。其中基于模板驅(qū)動(dòng)的映射是在XML文檔中嵌套SQL語句,執(zhí)行得到的結(jié)果。這是一種淺層的映射,只能從關(guān)系數(shù)據(jù)庫到XML文檔的映射?;谀P万?qū)動(dòng)的映射,是一種深層的映射。數(shù)據(jù)在數(shù)據(jù)庫與XML文檔之間進(jìn)行轉(zhuǎn)換時(shí),不僅僅是在XML文檔中嵌入SQL語句,而是用一個(gè)具體的模型實(shí)現(xiàn)的 [4]。
2 系統(tǒng)設(shè)計(jì)
本系統(tǒng)目標(biāo)是對于異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步的關(guān)鍵技術(shù)進(jìn)行研究,在實(shí)驗(yàn)環(huán)境下進(jìn)行數(shù)據(jù)同步系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),對系統(tǒng)進(jìn)行調(diào)試和試運(yùn)行。主要研究數(shù)據(jù)源數(shù)據(jù)的一致性的解決方案和降低數(shù)據(jù)傳輸時(shí)間和提高同步效率。
系統(tǒng)基于B/S模式設(shè)計(jì),采用ADO.net技術(shù)訪問數(shù)據(jù)庫,提供了Connection、Command、DataAdapter、DataReader、DataSet和DataTable等。允許程序員將SQL命令通過驅(qū)動(dòng)程序發(fā)送給數(shù)據(jù)庫,數(shù)據(jù)庫執(zhí)行后返回?cái)?shù)據(jù)處理結(jié)果。本系統(tǒng)的同步傳輸模型如圖1所示。
2.1 主數(shù)據(jù)庫選取
主數(shù)據(jù)庫是整個(gè)系統(tǒng)的中心,在更新操作中,將所有的更新數(shù)據(jù)傳送到主數(shù)據(jù)庫中,主數(shù)據(jù)庫負(fù)責(zé)對數(shù)據(jù)的分析和處理。由于主數(shù)據(jù)庫需要處理的任務(wù)很大,當(dāng)不能在短時(shí)間內(nèi)完成更新時(shí),可能會(huì)得到過期的數(shù)據(jù);并且當(dāng)主數(shù)據(jù)庫因故障不能夠進(jìn)行數(shù)據(jù)更新時(shí),系統(tǒng)將無法正常進(jìn)行,因此采用的是優(yōu)化的中心數(shù)據(jù)庫的方法,先選取異構(gòu)數(shù)據(jù)庫中的一個(gè)數(shù)據(jù)庫作為主數(shù)據(jù)庫,當(dāng)主數(shù)據(jù)庫發(fā)生故障時(shí),在從數(shù)據(jù)庫中選擇一個(gè)數(shù)據(jù)相對完整的數(shù)據(jù)庫作為主數(shù)據(jù)庫繼續(xù)處理數(shù)據(jù)。
2.2 數(shù)據(jù)庫表設(shè)計(jì)
為了解決命名沖突設(shè)計(jì)了數(shù)據(jù)源表、全局表、數(shù)據(jù)源表和全局表映射表。
1)數(shù)據(jù)源信息表
該表中存放了異構(gòu)數(shù)據(jù)庫中的各個(gè)數(shù)據(jù)庫的信息,主要用于異構(gòu)數(shù)據(jù)庫注冊。系統(tǒng)的首要任務(wù)是管理可以進(jìn)行數(shù)據(jù)同步的各個(gè)局部數(shù)據(jù)庫的數(shù)據(jù)表,為此,需要將各個(gè)節(jié)點(diǎn)的數(shù)據(jù)庫中用戶關(guān)心的連接信息和數(shù)據(jù)庫表的信息集成到全局?jǐn)?shù)據(jù)庫,全局?jǐn)?shù)據(jù)庫將這些信息存放全局?jǐn)?shù)據(jù)庫信息表中,實(shí)現(xiàn)局部的異構(gòu)數(shù)據(jù)庫注冊。數(shù)據(jù)源信息表結(jié)構(gòu)如表1所示。
2)全局表
由于各異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)模式是不同的,如果同一個(gè)數(shù)據(jù)分別存儲(chǔ)在不同數(shù)據(jù)庫中,那么它的表現(xiàn)形式會(huì)不同。所以把各個(gè)節(jié)點(diǎn)數(shù)據(jù)庫集成到同步系統(tǒng)中,通過建立全局?jǐn)?shù)據(jù)庫模式,用戶可以有這樣一種感覺,就是使用一個(gè)單一的數(shù)據(jù)庫。全局表如表2所示。
3)映射表
映射表存儲(chǔ)的是全局?jǐn)?shù)據(jù)庫與局部數(shù)據(jù)庫之間的對應(yīng)關(guān)系。如表3所示。將全局?jǐn)?shù)據(jù)庫與從數(shù)據(jù)庫中的數(shù)據(jù)通過表進(jìn)行對應(yīng)。
2.3 變更數(shù)據(jù)捕獲
不同的數(shù)據(jù)庫支持不同的變更數(shù)據(jù)捕獲方法。觸發(fā)器[5]是數(shù)據(jù)庫內(nèi)部的一種機(jī)制,它的概念比較明了,對于導(dǎo)致數(shù)據(jù)庫內(nèi)容發(fā)生變化的事件(增加、刪除或者修改),都可以自動(dòng)采取相關(guān)的動(dòng)作,通過觸發(fā)器可以直接獲取變更數(shù)據(jù)并且操作簡單,而且現(xiàn)如今常用的數(shù)據(jù)庫都支持觸發(fā)器機(jī)制,使用效率很高;控制表法不需要對原有的系統(tǒng)表結(jié)構(gòu)進(jìn)行修改,但是要為每一個(gè)需要同步的表都要?jiǎng)?chuàng)建一個(gè)控制表,對于存在大量需要同步的數(shù)據(jù)表的數(shù)據(jù)庫應(yīng)用來說,會(huì)占用大量的內(nèi)存空間;時(shí)間戳的方法需要在每個(gè)進(jìn)行同步的表上添加一個(gè)時(shí)間戳,用來記錄修改的時(shí)間,以便同步的時(shí)候判斷是否為最新數(shù)據(jù)[6]。該方法雖然不會(huì)影響應(yīng)用的運(yùn)行效率,但是需要對原有的系統(tǒng)做非常大的調(diào)整,而且只能捕獲到應(yīng)用程序造成的數(shù)據(jù)的變化。因此,在觸發(fā)器和控制表方法的設(shè)計(jì)思想的基礎(chǔ)上,提出了一種改進(jìn)的用于異構(gòu)數(shù)據(jù)庫同步的變更數(shù)據(jù)捕獲方法——觸發(fā)器法、時(shí)間戳法和控制表法相結(jié)合的方法。
該方法需要為每一個(gè)系統(tǒng)中的數(shù)據(jù)庫創(chuàng)建一個(gè)控制表,控制表中存放的是控制字段,包括數(shù)據(jù)發(fā)生變化的時(shí)間、變更數(shù)據(jù)所在的表名、變更數(shù)據(jù)的主鍵值、同步標(biāo)志等信息,然后對需要進(jìn)行同步的表創(chuàng)建相應(yīng)操作的觸發(fā)器,當(dāng)對表進(jìn)行DML操作時(shí),觸發(fā)器被觸發(fā),將控制信息存放到控制表中。本系統(tǒng)設(shè)計(jì)的捕獲數(shù)據(jù)的流程圖如圖2所示。
2.3.1 控制表結(jié)構(gòu)設(shè)計(jì)
為了方便提取變更數(shù)據(jù),在整個(gè)數(shù)據(jù)庫中為所有需要進(jìn)行同步的源數(shù)據(jù)庫表只創(chuàng)建了一個(gè)控制表Change,用來存放控制信息。當(dāng)執(zhí)行增刪改等DML操作時(shí),觸發(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)第一行說明要?jiǎng)?chuàng)建的觸發(fā)器名稱為tri_InsertUserInfor,源表名稱為UserInfor。
2)第二行說明在執(zhí)行insert插入操作時(shí)觸發(fā)器觸發(fā)。
3)第四行到第五行定義了觸發(fā)器觸發(fā)時(shí)的SQL語句。首先是將數(shù)據(jù)插入到Change表中,對應(yīng)的值分別為當(dāng)前時(shí)間、字段、發(fā)生變化的表名、發(fā)生變化的主鍵值、操作的類型和未同步標(biāo)識(shí)。由于Change表中的主鍵是自增字段,在執(zhí)行insert語句時(shí),不需要指定主鍵。Getdate()是獲取當(dāng)前系統(tǒng)的時(shí)間,將修改的時(shí)間存儲(chǔ)到Change表中,實(shí)現(xiàn)時(shí)間戳的概念。
有一張用戶表,其字段信息如表5所示。
當(dāng)執(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ù)進(jìn)行轉(zhuǎn)換。針對這些差異性,基于XML技術(shù),聲明源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫之間的異構(gòu)[8],以便實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換。
2.4.1 關(guān)系數(shù)據(jù)庫到XML文檔的轉(zhuǎn)換
實(shí)現(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字段的值來確定的,在實(shí)際的應(yīng)用中,對需同步的表的操作可能存在插入、刪除、更新三種情況,這三種對應(yīng)的SQL語句結(jié)構(gòu)都不相同。實(shí)現(xiàn)控制表中的控制信息的提取,文中概括了三種情況。
① 插入操作
在執(zhí)行插入操作時(shí),需要所有的字段對應(yīng)值,因此在生成XML文檔時(shí)需要將每個(gè)數(shù)據(jù)都插入。因?yàn)榭刂票碇兄淮娣趴刂菩畔ⅲ瑳]有數(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表,將用戶信息表中的每個(gè)字段作為一個(gè)節(jié)點(diǎn)名稱,每個(gè)字段對應(yīng)的值作為節(jié)點(diǎn)值,再從Change表中獲取四個(gè)控制節(jié)點(diǎn)記錄信息,控制節(jié)點(diǎn)的作用是根據(jù)源表信息在文件中找到對應(yīng)的目標(biāo)表的信息,從而達(dá)到同步的效果。其中一條插入數(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ù)庫類型。
② 更新操作
更新操作與插入操作類似。更新包括主鍵更新和非主鍵更新。上面介紹的控制表中有個(gè)字段C_Field,該字段的作用是存放主鍵更新操作時(shí)的更新前的主鍵值。
③ 刪除操作
刪除操作很簡單,通常一條刪除語句可以通過主鍵的唯一性即可刪除一條記錄,所以在設(shè)計(jì)XML文檔時(shí),可以直接將Change表中讀取C_Key字段,不再需要和源表UserInfor關(guān)聯(lián)。
2)將關(guān)系模式映射為XML Schema
將關(guān)系數(shù)據(jù)庫中的關(guān)系模式映射為對應(yīng)的XML Schema,為XML文檔提供描述標(biāo)準(zhǔn)。程序中關(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語句,然后在目標(biāo)數(shù)據(jù)庫中執(zhí)行,采用Linq to XML 操作XML文件。通過XElement類讀取XML文件,使用XElement類中提供的Element和Elements方法定位到某個(gè)或某些元素,XAttribute類中提供的Attribute和Attributes方法定位到某個(gè)或某些屬性,將XML中的元素和屬性提取出來,還原SQL語句,連接目標(biāo)數(shù)據(jù)庫后執(zhí)行,將變化數(shù)據(jù)反映到目標(biāo)數(shù)據(jù)庫當(dāng)中。
public decryptXMLFile(string filePath)
{
publi XElement xmlDoc = XElement.Load(filePath);//通過文件路徑加載XML文件
IEnumerable
…
}
3 結(jié)論
系統(tǒng)采用改進(jìn)的基于觸發(fā)器、控制表和時(shí)間戳的變更數(shù)據(jù)捕獲方法和基于XML框架解決了多個(gè)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步的問題,通過測試和使用,該方案的可靠性和穩(wěn)定性得到了證明。該方案實(shí)用性強(qiáng),實(shí)現(xiàn)了數(shù)據(jù)的共享和交換功能。
參考文獻(xiàn):
[1] 林源,陳志泊.分布式異構(gòu)數(shù)據(jù)庫同步系統(tǒng)的研究與應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(24):5278-5281.
[2] 申毅,武小年.分布式異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步系統(tǒng)的實(shí)現(xiàn)與優(yōu)化[J].桂林電子科技大學(xué)學(xué)報(bào),2014,34(4):285-289.
[3] 王玉標(biāo),饒錫如,何盼.異構(gòu)環(huán)境下數(shù)據(jù)庫增量同步更新機(jī)制[J].計(jì)算機(jī)工程與設(shè)計(jì),2011(11):948-951.
[4] 楊鵬,楊海濤,王正華.異構(gòu)數(shù)據(jù)庫變化捕捉及同步策略[J].計(jì)算機(jī)工程,2008,34(16):53-55.
[5] 王軍.基于XML的分布式異構(gòu)數(shù)據(jù)庫同步研究與設(shè)計(jì)[D].南昌大學(xué),2007:11-13.
[6] 沈敏,許華虎,季永華,等.基于XML的分布式異構(gòu)數(shù)據(jù)庫數(shù)據(jù)同步系統(tǒng)的研究[D].計(jì)算機(jī)工程與應(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è)計(jì)與實(shí)現(xiàn)[J].廣西通信技術(shù),2014(4):21-25.
[9] 戴婉榮.基于分布式數(shù)據(jù)庫的數(shù)據(jù)同步機(jī)制的研究與應(yīng)用[D].武漢:武漢理工大學(xué),2010:45-47.