摘要:針對(duì)臨盤采油廠的數(shù)據(jù)遷移的具體需求,該文提出了一種基于XML的數(shù)據(jù)遷移模型,以實(shí)現(xiàn)數(shù)據(jù)的提取、轉(zhuǎn)換、寫(xiě)入等功能。它采用JAVA和XML技術(shù),具有很好的跨平臺(tái)、易擴(kuò)展、復(fù)用性等,能很好的解決異構(gòu)數(shù)據(jù)庫(kù)間數(shù)據(jù)遷移的問(wèn)題。
關(guān)鍵詞:數(shù)據(jù)遷移;XML;異構(gòu)數(shù)據(jù)庫(kù)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)01-0011-04
臨盤采油廠綜合信息平臺(tái)始建于2001年,積累了很多重要的油田數(shù)據(jù)。隨著“數(shù)字油田”的發(fā)展趨勢(shì),臨盤采油廠的數(shù)據(jù)需要遷移到一個(gè)統(tǒng)一的源頭數(shù)據(jù)庫(kù),這樣不僅臨盤采油廠可以訪問(wèn)數(shù)據(jù)庫(kù)中的信息,其他系統(tǒng)也可以共享其數(shù)據(jù),以達(dá)到信息統(tǒng)一管理、信息共享的目的。這樣能很好的解決了“信息孤島”的現(xiàn)象。針對(duì)上述問(wèn)題,結(jié)合現(xiàn)有的數(shù)據(jù)遷移轉(zhuǎn)換技術(shù),設(shè)計(jì)一個(gè)數(shù)據(jù)遷移轉(zhuǎn)換接口是十分必要的。它將實(shí)現(xiàn)將來(lái)源離散且格式多樣的臨盤采油廠數(shù)據(jù)進(jìn)行處理后,再將這些標(biāo)準(zhǔn)化數(shù)據(jù)遷移到源頭數(shù)據(jù)庫(kù)中,為臨盤采油廠和其他管理部門提供標(biāo)準(zhǔn)統(tǒng)一的數(shù)據(jù)信息,實(shí)現(xiàn)數(shù)據(jù)的共享。
1 數(shù)據(jù)遷移相關(guān)技術(shù)及解決思路
1.1常用的數(shù)據(jù)遷移技術(shù)
數(shù)據(jù)遷移是指將源數(shù)據(jù)庫(kù)中指定表的數(shù)據(jù)進(jìn)行清洗、轉(zhuǎn)換并裝載到目的數(shù)據(jù)庫(kù)指定表中的過(guò)程[1]。數(shù)據(jù)遷移可以分為抽取、轉(zhuǎn)換、裝載三個(gè)步驟。數(shù)據(jù)抽取是根據(jù)實(shí)際應(yīng)用,對(duì)舊系統(tǒng)的底層數(shù)據(jù)進(jìn)行篩選,選擇出需要的待遷移數(shù)據(jù)。轉(zhuǎn)換是根據(jù)新舊數(shù)據(jù)庫(kù)的映射關(guān)系進(jìn)行的,首先比較新舊系統(tǒng)中字段數(shù)據(jù)類型的差異和聯(lián)系,找出適當(dāng)?shù)膶?duì)應(yīng)關(guān)系,然后進(jìn)行相應(yīng)的轉(zhuǎn)換。數(shù)據(jù)裝載是通過(guò)數(shù)據(jù)遷移工具或事先編寫(xiě)的SQL程序?qū)⒊槿?、轉(zhuǎn)換后的數(shù)據(jù)寫(xiě)入到目標(biāo)數(shù)據(jù)庫(kù)對(duì)應(yīng)的表中。數(shù)據(jù)遷移的基本流程如圖1所示。
常用的幾種數(shù)據(jù)遷移的實(shí)現(xiàn)方法有以下幾種[2]:
1.1.1 數(shù)據(jù)庫(kù)廠商的專業(yè)工具
當(dāng)前很多數(shù)據(jù)庫(kù)廠家都提供專門的數(shù)據(jù)遷移工具,常見(jiàn)的有Informix的Infomover、Microsoft SQL Server的DTS和Oracle的Oracle Warehouse Builder等。國(guó)內(nèi)的主流數(shù)據(jù)庫(kù)廠商如DM、King Base、GBase等也都有著自己的數(shù)據(jù)庫(kù)遷移工具。
1.1.2 利用前臺(tái)開(kāi)發(fā)工具
PowerBuilder 是廣泛用于數(shù)據(jù)庫(kù)前臺(tái)開(kāi)發(fā)的軟件,它對(duì)不同數(shù)據(jù)庫(kù)采用不同接口(ODBC 或?qū)S媒涌冢?,可以支持多種關(guān)系數(shù)據(jù)庫(kù)。
1.1.3 利用數(shù)據(jù)庫(kù)組件轉(zhuǎn)換
利用. net 數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)技術(shù)實(shí)現(xiàn)源數(shù)據(jù)庫(kù)向目標(biāo)數(shù)據(jù)庫(kù)的直接轉(zhuǎn)換。這個(gè)過(guò)程中使用了ADO. NET提供的兩個(gè)核心組件:DataSet 和DataProvider。DataSet 組件的設(shè)計(jì)實(shí)現(xiàn)了獨(dú)立于任何數(shù)據(jù)源的數(shù)據(jù)訪問(wèn), DataProvider 組件的設(shè)計(jì)實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的連接、操作、讀取的訪問(wèn)。
1.1.4 基于中間件的解決方法
顧名思義,這種方法就是在源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)間建立一個(gè)中間層。將用戶對(duì)不同數(shù)據(jù)庫(kù)的操作變?yōu)閷?duì)單一中間件的操作,然后經(jīng)過(guò)中間件的處理實(shí)現(xiàn)數(shù)據(jù)遷移處理?;谥虚g件的解決方案有以下優(yōu)點(diǎn):
(1)易于移植和集成。中間件將各種與平臺(tái)相關(guān)的細(xì)節(jié)進(jìn)行了封裝,即使變更操作系統(tǒng)或通信協(xié)議等底層配置,也不用改變應(yīng)用程序代碼。
(2)易于擴(kuò)充。中間件若有局部變動(dòng)和整體升級(jí),只要對(duì)外的接口保持不變,就不會(huì)影響系統(tǒng)其它部分的正常運(yùn)行,從功能上對(duì)應(yīng)用程序?qū)崿F(xiàn)了透明。
(3)訪問(wèn)透明、使用簡(jiǎn)單。中間件封裝了底層的具體實(shí)現(xiàn)細(xì)節(jié),對(duì)各種數(shù)據(jù)源使用統(tǒng)一的方法訪問(wèn),這對(duì)用戶來(lái)說(shuō)是透明的。
1.2 XML及JAVA技術(shù)
XML(Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言)以一種自我描述的方式進(jìn)行數(shù)據(jù)結(jié)構(gòu)定義,在描述數(shù)據(jù)內(nèi)容的同時(shí)也突出了對(duì)結(jié)構(gòu)的描述,從而體現(xiàn)出數(shù)據(jù)之間的關(guān)系。XML的優(yōu)點(diǎn)很多,如高可擴(kuò)展性、平臺(tái)無(wú)關(guān)性、自描述性等等。XML技術(shù)的發(fā)展非常迅速,在許多領(lǐng)域都得到廣泛的應(yīng)用。
JAVA是面向?qū)ο笮驼Z(yǔ)言,它繼承了C++語(yǔ)言面向?qū)ο蠹夹g(shù)的核心,它集成了其它一些語(yǔ)言的特點(diǎn)和優(yōu)勢(shì),又避開(kāi)了它們的不足之處。Java中常用連接數(shù)據(jù)庫(kù)的技術(shù)是JDBC,很多數(shù)據(jù)庫(kù)都帶有JDBC驅(qū)動(dòng)程序[3]。SUN公司還開(kāi)發(fā)了JDBC-ODBC橋,用此技術(shù)可以實(shí)現(xiàn)對(duì)帶有ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)的訪問(wèn)。
Java和XML有許多相似的特性,比如平臺(tái)無(wú)關(guān)性、可擴(kuò)展性、可重用性等,因此它與XML結(jié)合起來(lái),是實(shí)現(xiàn)中間件的一個(gè)很好的方式。
1.3 數(shù)據(jù)遷移接口思路
現(xiàn)今臨盤采油廠數(shù)據(jù)庫(kù)中的數(shù)據(jù)需要遷移到統(tǒng)一的源頭數(shù)據(jù)庫(kù)中,但新舊數(shù)據(jù)庫(kù)系統(tǒng)存在一定的差異,如數(shù)據(jù)庫(kù)系統(tǒng)的差異、數(shù)據(jù)表結(jié)構(gòu)的差異、數(shù)據(jù)類型的差異等。如何解決這些問(wèn)題是該文的難點(diǎn)和重點(diǎn)。
Java和xml的完美結(jié)合為問(wèn)題的解決提供了一個(gè)很好的途徑,因此本文的解決方案就是利用java和xml實(shí)現(xiàn)數(shù)據(jù)的跨平臺(tái)的遷移。
數(shù)據(jù)遷移的基本思路如下:
首先,建立各種關(guān)系數(shù)據(jù)庫(kù)的 XML 數(shù)據(jù)模型,根據(jù)具體的需求選擇相應(yīng)的列,將數(shù)據(jù)庫(kù)中單個(gè)或者多個(gè)表映射成相應(yīng)的 XML的屬性或文檔結(jié)構(gòu),然后提取表中的數(shù)據(jù),加以整理和組合生成相應(yīng) XML文檔,也就是將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為 XML 格式的數(shù)據(jù)文件。
然后,就可以定義XML Schema的數(shù)據(jù)約束規(guī)則來(lái)控制程序,它在數(shù)據(jù)遷移過(guò)程中起著非常重要的作用。根據(jù) XML Schema 及自定義約束規(guī)則進(jìn)行數(shù)據(jù)的完整性校驗(yàn)。
最后,利用java語(yǔ)言實(shí)現(xiàn)對(duì)生成的XML的讀取,把XML文本中的內(nèi)容讀取出來(lái),同時(shí)找到和目標(biāo)數(shù)據(jù)庫(kù)表中的對(duì)應(yīng)關(guān)系,最終把數(shù)據(jù)導(dǎo)入目標(biāo)數(shù)據(jù)庫(kù)表中。
2 異構(gòu)數(shù)據(jù)庫(kù)數(shù)據(jù)遷移方案設(shè)計(jì)
2.1數(shù)據(jù)庫(kù)遷移面臨的問(wèn)題及總體流程設(shè)計(jì)
臨盤采油廠數(shù)據(jù)遷移面臨的問(wèn)題:
1)數(shù)據(jù)庫(kù)系統(tǒng)的異構(gòu)
臨盤采油廠開(kāi)發(fā)平臺(tái)采用的是Access、SQLServer數(shù)據(jù)庫(kù),而源頭數(shù)據(jù)庫(kù)采用的是Oracle數(shù)據(jù)庫(kù)。
2)數(shù)據(jù)表結(jié)構(gòu)的不同
臨盤采油廠開(kāi)發(fā)平臺(tái)中數(shù)據(jù)庫(kù)Access、SQLServer中的表結(jié)構(gòu)和源頭數(shù)據(jù)庫(kù)(目標(biāo)數(shù)據(jù)庫(kù))中的表結(jié)構(gòu)存在差異,如:列名稱不同、列的數(shù)目不同、存在列的組合情況等。
3)數(shù)據(jù)表的數(shù)據(jù)類型不同
臨盤采油廠開(kāi)發(fā)平臺(tái)中數(shù)據(jù)庫(kù)Access、SQLServer與源頭數(shù)據(jù)庫(kù)Oracle中的數(shù)據(jù)類型存在差異。
4)數(shù)據(jù)表之間行列轉(zhuǎn)換問(wèn)題
源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)之間存在行列轉(zhuǎn)換的問(wèn)題。
為了很好解決上述問(wèn)題,該文采用了基于xml的中間件,數(shù)據(jù)遷移的總體流程圖如圖2。
用戶是在了解源頭數(shù)據(jù)庫(kù)基本結(jié)構(gòu)的情況下,進(jìn)行數(shù)據(jù)庫(kù)中數(shù)據(jù)表的選擇,可以把整個(gè)表結(jié)構(gòu)通過(guò)Java映射為XML文件,也可以選擇其中部分字段進(jìn)行映射,或者是一些字段組合成一個(gè)新的字段。
通過(guò)相應(yīng)的XML格式檢測(cè),如果XML文件格式合法,則根據(jù)XML文件中的結(jié)構(gòu)進(jìn)行其與目標(biāo)數(shù)據(jù)庫(kù)中表的結(jié)構(gòu)進(jìn)行對(duì)應(yīng)。XML中的標(biāo)簽名可以不同于目標(biāo)數(shù)據(jù)庫(kù)中表的列名,這樣就解決了源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)表列名不同的問(wèn)題。
最后,用Java采用DOM、JDOM或者SAX的解析方式,把XML文件中的數(shù)據(jù)讀取到目標(biāo)數(shù)據(jù)庫(kù)。
2.2源數(shù)據(jù)庫(kù)到XML文件的數(shù)據(jù)轉(zhuǎn)化
在程序開(kāi)發(fā)過(guò)程中,需要連接源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù),連接數(shù)據(jù)庫(kù)采用JAVA語(yǔ)言的JDBC驅(qū)動(dòng)程序。該驅(qū)動(dòng)程序具有效率高的特點(diǎn),不會(huì)增加額外的開(kāi)銷,由純JAVA語(yǔ)言開(kāi)發(fā)而成,擁有最佳的兼容性。
在源數(shù)據(jù)庫(kù)和XML文檔之間進(jìn)行轉(zhuǎn)換和高效的傳遞數(shù)據(jù),必須在XML文件和數(shù)據(jù)庫(kù)表結(jié)構(gòu)之間建立映射[4],建立它們之間的映射有兩種常用的映射方法:基于模板驅(qū)動(dòng)的映射和基于模型驅(qū)動(dòng)的映射[5]。
本文采用了基于模板驅(qū)動(dòng)的映射來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)到XML文檔的數(shù)據(jù)轉(zhuǎn)換。在模板中加入了SQL命令,經(jīng)過(guò)中間件的處理生成相應(yīng)的XML文件。
流程如下圖3。
基于模板驅(qū)動(dòng)的映射操作比較靈活,但是它只支持關(guān)系型數(shù)據(jù)庫(kù)轉(zhuǎn)換到XML文檔。
2.3 XML文檔數(shù)據(jù)轉(zhuǎn)移到目標(biāo)數(shù)據(jù)庫(kù)
XML文檔中的數(shù)據(jù)轉(zhuǎn)換到目標(biāo)數(shù)據(jù)庫(kù)中,我們準(zhǔn)備采用基于模型驅(qū)動(dòng)的映射模式,利用生成的XML文檔中的數(shù)據(jù)結(jié)構(gòu)顯性或隱性的與目標(biāo)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行映射[6]。在此過(guò)程中采用DOM、JDOM或者SAX接口進(jìn)行XML文件的解析。
其流程圖如圖4。
實(shí)現(xiàn)XML文檔數(shù)據(jù)到目標(biāo)數(shù)據(jù)庫(kù)中的轉(zhuǎn)換步驟如下:
1)首先通過(guò)XML語(yǔ)法分析處理器檢測(cè)XML文檔結(jié)構(gòu)。
2)將分析處理的結(jié)果送到XML的解析器(DOM、JDOM或者SAX)中進(jìn)行解析,將其中的內(nèi)容轉(zhuǎn)換到JAVA對(duì)象中。
3)連接目標(biāo)數(shù)據(jù)庫(kù),把JAVA對(duì)象中的數(shù)據(jù)插入到目標(biāo)數(shù)據(jù)庫(kù)中。
基于模型的驅(qū)動(dòng)映射結(jié)構(gòu)簡(jiǎn)單,使用易用,但是和基于模板的驅(qū)動(dòng)相比,它不夠靈活,因?yàn)樗成涞氖蔷唧w的數(shù)據(jù)模型,不過(guò)可以通過(guò)XSL實(shí)現(xiàn)其靈活性。
3 結(jié)束語(yǔ)
本文介紹了采用JAVA技術(shù)和XML技術(shù)實(shí)現(xiàn)臨盤采油廠的數(shù)據(jù)轉(zhuǎn)換接口的實(shí)現(xiàn)方法。此方法可以很好的實(shí)現(xiàn)數(shù)據(jù)的遷移,采用XML作為中間數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)很好的屏蔽了數(shù)據(jù)庫(kù)系統(tǒng)之間的差異性,如數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型等,而且XML和JAVA都具有很好的跨平臺(tái)性,可以實(shí)現(xiàn)了系統(tǒng)的跨平臺(tái)性。
參考文獻(xiàn):
[1] 尹建璋.基于XML的應(yīng)用層數(shù)據(jù)交換技術(shù)的研究[J].計(jì)算機(jī)與現(xiàn)代化,2009 (11).
[2] 張欣欣.綜合錄井儀數(shù)據(jù)遷移及轉(zhuǎn)換接口技術(shù)研究[D].中國(guó)石油大學(xué),2008.
[3] 孔翔鷹,李治柱.XML與數(shù)據(jù)庫(kù)雙向接口的研究和實(shí)現(xiàn)[J].微型電腦應(yīng)用,2006,9(22):48-52.
[4] 周競(jìng)濤.基于XML的異構(gòu)數(shù)據(jù)庫(kù)集成中間件技術(shù)研究[D].西安:西北工業(yè)大學(xué),2002.
[5] Giuseppe Psaila.ERX:An ExPerience inIntegrating ER Models RDB and XML Teclinologies .EDBT 2002 Workshops .LNCS,2490.2002:242-265.
[6] 戴永壽,張淑英.基于JAVA和XML的綜合錄井儀數(shù)據(jù)轉(zhuǎn)換接口技術(shù)進(jìn)展[J].錄井工程, 2008,19(2).
[7] 鄭仕勇,李碧青.基于XML和中間件的數(shù)據(jù)遷移模型研究與設(shè)計(jì)[J].軟件導(dǎo)刊, 2012,11(4).
[8] 王云曉,張學(xué)誠(chéng),屈彪.基于XML的構(gòu)件庫(kù)管理系統(tǒng)實(shí)現(xiàn)研究[J].計(jì)算機(jī)應(yīng)用與軟件,2009(26).
[9] 歐陽(yáng)崢崢,李禹生.基于XML的異構(gòu)數(shù)據(jù)庫(kù)數(shù)據(jù)交換中間件的研究[J].計(jì)算機(jī)與現(xiàn)代化,2008(12).
[10] 李鐘雋.基于XML數(shù)據(jù)遷移中間件的研究[D].哈爾濱:哈爾濱工程大學(xué),2007.