圣文順 喬雨 邵琳潔
摘 要:隨著網(wǎng)絡(luò)和數(shù)據(jù)庫技術(shù)的廣泛應(yīng)用,使得不同的業(yè)務(wù)系統(tǒng)之間需要進(jìn)行更多的數(shù)據(jù)交互。如何便捷高效地在異構(gòu)數(shù)據(jù)庫之間傳輸這些數(shù)據(jù)成為實(shí)際應(yīng)用中的一個(gè)重要議題。XML憑借其自身極強(qiáng)的平臺(tái)適應(yīng)性和可讀性特點(diǎn),在解決這個(gè)問題方面發(fā)揮了積極的作用。介紹了一種基于XML的異構(gòu)數(shù)據(jù)庫信息交互機(jī)制,通過實(shí)例的方式闡述了該方法具體的實(shí)現(xiàn)過程,并且結(jié)合實(shí)驗(yàn)結(jié)果驗(yàn)證了該方法的可行性。
關(guān)鍵詞:XML;異構(gòu)數(shù)據(jù)庫;信息交互;Java;JDBC;SQL Server
中圖分類號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):2095-1302(2019)12-00-04
0 引 言
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,各種分布式系統(tǒng)被廣泛應(yīng)用,由此產(chǎn)生了大量數(shù)據(jù)交互需求。在現(xiàn)實(shí)中,需要交互的系統(tǒng)使用不同數(shù)據(jù)庫的現(xiàn)象非常普遍,為系統(tǒng)間的信息交流帶來了極大不便,有時(shí)不得不為每套系統(tǒng)開發(fā)專用的數(shù)據(jù)導(dǎo)入導(dǎo)出工具。為了解決這個(gè)問題,我們引入XML(Extensible Markup Language)作為中間媒介來表示需要交互的數(shù)據(jù)。XML是通用的規(guī)范語言,具有操作簡單、可擴(kuò)展性強(qiáng)等特點(diǎn),使得它適合作為信息交互的工具[1]。
1 XML簡介
XML是一種可擴(kuò)展的標(biāo)記語言,由W3C組織于1998年2月制定,它繼承了SGML(Standard Generalized Markup Language)的許多特性,但復(fù)雜性較SGML卻大大降低。XML作為一種建模工具,可以方便地表示數(shù)據(jù)庫中表的屬性,并實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)[2]。
XML作為通用的語言規(guī)范,與具體的數(shù)據(jù)平臺(tái)無關(guān),在保存數(shù)據(jù)的同時(shí)也可以方便地對(duì)XML文件中的數(shù)據(jù)進(jìn)行修改。因此將它作為不同數(shù)據(jù)庫之間交互的統(tǒng)一接口進(jìn)行數(shù)據(jù)的動(dòng)態(tài)傳輸和修改[3]。
2 設(shè)計(jì)實(shí)現(xiàn)
2.1 設(shè)計(jì)思想
XML文檔作為數(shù)據(jù)庫信息交互過程中數(shù)據(jù)的載體,首先從源數(shù)據(jù)庫獲取數(shù)據(jù),并按一定的格式存儲(chǔ)為XML文檔,經(jīng)過必要處理后,再將數(shù)據(jù)導(dǎo)入目的數(shù)據(jù)庫,如圖1所示。
利用XML實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫信息交互的兩個(gè)基本步驟[4]如下。
(1)將源數(shù)據(jù)庫中的數(shù)據(jù)信息導(dǎo)入XML文檔中。
(2)將XML文檔中的數(shù)據(jù)信息導(dǎo)入目的數(shù)據(jù)庫中:在生成XML文檔時(shí),以數(shù)據(jù)庫表為單位,每張表對(duì)應(yīng)生成一個(gè)XML文檔;文檔的前半部分記錄表自身的屬性信息,后半部分記錄表中的數(shù)據(jù)。結(jié)構(gòu)如下:
采用這種方式可以有效地映射出數(shù)據(jù)庫的整體結(jié)構(gòu),并且可以方便地在XML文檔中查詢或者修改數(shù)據(jù)、表屬性及其他中間操作,從而為導(dǎo)入目的數(shù)據(jù)庫階段提供合適的數(shù)據(jù)源。
2.2 開發(fā)語言
很多情況下,需要交互的數(shù)據(jù)庫系統(tǒng)位于不同的系統(tǒng)平臺(tái)上。Java作為一種流行的編程語言,其普及的關(guān)鍵原因在于其平臺(tái)無關(guān)性,只要運(yùn)行的平臺(tái)上裝有JVM(Java虛擬機(jī))就可以執(zhí)行Java程序。因此,將Java作為實(shí)現(xiàn)語言的首選[5]。
JDBC(Java Data Base Connectivity)是一種為Java語言提供連接關(guān)系型數(shù)據(jù)庫的解決方案,它為開發(fā)者提供統(tǒng)一的API并屏蔽底層數(shù)據(jù)庫操作接口的差異性,應(yīng)用程序可以通過JDBC方便地與不同的數(shù)據(jù)庫通信。
2.3 舉例實(shí)現(xiàn)
以表1、表2中的數(shù)據(jù)為例,表Student中的Nationality為外鍵,對(duì)應(yīng)表Nation中的ID。假設(shè)這些表原先存儲(chǔ)在Oracle數(shù)據(jù)庫中,現(xiàn)在要將其中的數(shù)據(jù)映射到SQL Server數(shù)據(jù)庫的表中。
2.3.1 連接數(shù)據(jù)庫并獲取數(shù)據(jù)庫信息
利用JDBC連接數(shù)據(jù)庫,先加載Oracle的JDBC驅(qū)動(dòng)器,然后使用DriverManager來建立數(shù)據(jù)庫連接,方法如下:
String Driver="oracle.jdbc.driver.OracleDriver";
String URL="jdbc:oracle:thin:@IP:1521:orcl";
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,usemame,password);
為了成功地將表映射到另一個(gè)數(shù)據(jù)庫中,我們需要保存表自身的一些屬性信息,包括表名、包含的列、列的數(shù)據(jù)類型、主外鍵關(guān)系等。由于Oracle數(shù)據(jù)庫提供了專門的系統(tǒng)視圖來記錄這些信息,因此我們只需運(yùn)用Select語句從中查詢即可。表3中列出了其中的部分視圖,其他大部分?jǐn)?shù)據(jù)庫如SQL Server等,都有類似的系統(tǒng)視圖供查詢信息。
2.3.2 把數(shù)據(jù)從Oracle數(shù)據(jù)庫導(dǎo)入XML文檔
(1)映射表的屬性信息到XML
獲取屬性信息后,可以將它們保存在DTD文檔中,也可以直接格式化在XML文檔中,這里我們采用后者。
表Student的屬性映射到XML文檔:
<?xml version="1.0" encoding="UTF-8"?>
表Nation的屬性映射到XML文檔:
<?xml version="1.0" encoding="UtF-8"?>
從上面可以看到table標(biāo)簽包含兩個(gè)屬性,其中table_name為表名,fk表示該表是否含有外鍵,若無外鍵,可省略該屬性。columns標(biāo)簽中包含表中所有的列。以表Nation為例,它包含兩個(gè)列,ID和Nation,分別用子標(biāo)簽col表示。子標(biāo)簽中的type屬性用來表示列的數(shù)據(jù)類型。
(2)將表中的數(shù)據(jù)映射到XML
XML文檔中數(shù)據(jù)的組成模式參考數(shù)據(jù)庫中的數(shù)據(jù)存儲(chǔ)方式,采用數(shù)據(jù)行映射模式。表Student映射成XML文檔:
<?xml version="1.0" encoding="UtF-8"?>
表Nation映射成XML文檔:
<?xml version="1.0" encoding="UtF-8"?>
在上面的映射模式中,Rows標(biāo)簽中包含數(shù)據(jù)庫表所有的行記錄,其中,每個(gè)子標(biāo)簽Row代表一行記錄,而每行的屬性值則用表的列名稱為子標(biāo)簽進(jìn)行封裝。
需要注意的是,XML文檔僅封裝可顯示的文本。若表中的數(shù)據(jù)類型為BLOB等二進(jìn)制數(shù)據(jù)類型,則需先將該值轉(zhuǎn)換成可顯示的文本值后再進(jìn)行封裝;通常使用BASE64算法將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化成可顯示的文本值,Java中也提供相應(yīng)的API,如利用BASE64Encoder和BASE64Decoder完成二進(jìn)制和可顯示文本的相互轉(zhuǎn)化。
2.3.3 把數(shù)據(jù)從XML文檔導(dǎo)入SQL Server數(shù)據(jù)庫
首先需要對(duì)XML文檔進(jìn)行分析,這部分工作需要調(diào)用XML DOM中的API來完成。DOM是由W3C定義的一套用來分析、驗(yàn)證及更新XML的工具。DOM需要將整篇XML文檔讀入內(nèi)存中,生成一個(gè)相應(yīng)的Document實(shí)例并對(duì)其進(jìn)行分析[5-6]。
我們可以從文檔的前半部分得到列的相應(yīng)信息,然后再對(duì)Rows標(biāo)簽中的內(nèi)容進(jìn)行遍歷分析,進(jìn)而獲取表中的數(shù)據(jù)。Rows標(biāo)簽中的內(nèi)容可以看成一個(gè)樹型結(jié)構(gòu),如圖2所示,每個(gè)葉結(jié)點(diǎn)對(duì)應(yīng)一個(gè)屬性列,它的值就是我們要導(dǎo)入的數(shù)據(jù)。
導(dǎo)入數(shù)據(jù)庫的工作利用JDBC完成,可以調(diào)用Statement類中的execute()方法執(zhí)行insert SQL語句實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入。建議使用PreparedStatement類代替Statement,因?yàn)榇蠖鄶?shù)情況下導(dǎo)入一個(gè)表所需的SQL語句結(jié)構(gòu)是相同的,不同之處在于導(dǎo)入的參數(shù),在這種情況下可以事先用PreparedStatement類對(duì)相關(guān)SQL語句進(jìn)行預(yù)編譯。當(dāng)需要執(zhí)行語句時(shí),只要根據(jù)導(dǎo)入值的數(shù)據(jù)類型選擇相應(yīng)的Set()方法將參數(shù)填入即可,可實(shí)現(xiàn)多次重用。在導(dǎo)入表的數(shù)據(jù)量很大時(shí),使用該方式可以大幅提高效率。
2.3.4 XML文檔導(dǎo)入數(shù)據(jù)庫的順序
在從XML文檔導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫時(shí),由于某些表之間存在外鍵約束關(guān)系,使得寫入數(shù)據(jù)時(shí)可能會(huì)發(fā)生錯(cuò)誤。我們需要在導(dǎo)入數(shù)據(jù)前檢查此類約束并暫時(shí)關(guān)閉,待數(shù)據(jù)導(dǎo)入后再重新啟用。
對(duì)于某些不支持關(guān)閉約束檢查的數(shù)據(jù)庫,我們采用分組導(dǎo)入的方法。將所有的表分成有外鍵和無外鍵兩組,先將無外鍵組的表導(dǎo)入數(shù)據(jù)庫,再導(dǎo)入有外鍵組的表。由于可能出現(xiàn)級(jí)聯(lián)外鍵的情況,如圖3所示,因此需要循環(huán)導(dǎo)入有外鍵組的表,直到該組為空。
(1)將所有的XML文檔按對(duì)應(yīng)表中是否存在外鍵分成A,B兩組,按任意順序排序。無外鍵為A組,有外鍵為B組。
(2)將A組XML文檔中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫。
(3)遍歷B組中的XML文檔,并做操作:獲取table標(biāo)簽的FK屬性值,并判斷其外鍵依賴的表所對(duì)應(yīng)的XML文檔是否在A組中,若已在A組中,則將該文檔中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫并將其移至A組;否則,將其留在B組。
(4)重復(fù)執(zhí)行步驟(3),直至B組為空。
2.4 性能分析
由于在導(dǎo)入階段要進(jìn)行大量數(shù)據(jù)庫寫操作,所以系統(tǒng)的耗時(shí)主要集中在XML映射到數(shù)據(jù)庫的階段。其中,若目的數(shù)據(jù)庫允許先關(guān)閉約束檢查再導(dǎo)入,則系統(tǒng)性能主要取決于JDBC對(duì)數(shù)據(jù)庫的訪問效率;若目的數(shù)據(jù)庫不支持關(guān)閉約束檢查功能,則需采用本文介紹的分組導(dǎo)入方法。
利用分組導(dǎo)入方法時(shí),最壞情況為所有的表構(gòu)成一個(gè)圖3所示的級(jí)聯(lián)外鍵鏈,在這種情況下,B組中有n-1張表。按最壞的情況考慮,系統(tǒng)需要訪問XML文檔的次數(shù)為(n-l)+(n-2)+...+1=(n2-n)/2次。系統(tǒng)對(duì)數(shù)據(jù)庫的操作次數(shù)和先關(guān)閉約束檢查再導(dǎo)入的情況相同,每個(gè)XML文檔(n2-n)/2次。實(shí)踐發(fā)現(xiàn),分組導(dǎo)入方法和先關(guān)閉約束檢查再導(dǎo)入方法性能相當(dāng),雖然后者訪問XML的次數(shù)為n,但是訪問XML文檔的效率卻遠(yuǎn)高于訪問數(shù)據(jù)庫的效率,且兩種情況下訪問數(shù)據(jù)庫的次數(shù)相同,因此兩者的性能基本持平。
3 結(jié) 語
XML作為數(shù)據(jù)庫中信息交互的載體,具有操作簡單、訪問速度快、平臺(tái)無關(guān)性等優(yōu)點(diǎn)。縱觀當(dāng)前數(shù)據(jù)庫技術(shù)的發(fā)展趨勢,XML與數(shù)據(jù)庫的結(jié)合越來越緊密,應(yīng)用范圍也越來越廣,我們有理由相信,XML將在數(shù)據(jù)庫應(yīng)用領(lǐng)域發(fā)揮更大的作用。
參 考 文 獻(xiàn)
[1]王丹.基于XML的用戶界面模式標(biāo)記語言UIPML[J].中國科技信息,2019(3).
[2]王曉剛.基于關(guān)系數(shù)據(jù)庫的XML存儲(chǔ)技術(shù)[J].中國高新技術(shù)企業(yè),2011(5):88-89.
[3]李金來,吳濤.基于JSON數(shù)據(jù)交換的移動(dòng)終端與服務(wù)器端異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)交互[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2016(11):55-58.
[4]劉思.基于XML中間件數(shù)據(jù)庫間信息交換技術(shù)研究[M].天津:天津理工大學(xué),2014.
[5] HU X L. Practice of CBL Teaching Method in Java Programming Teaching Based on Network Teaching Platform [C]// Proceedings of 2018 5th International Conference on Education,Management,Arts,Economics and Social Science(ICEMAESS 2018),2018.11.10.
[6]龍鳳.基于XML和中間件的異構(gòu)數(shù)據(jù)庫集成研究[J].電子技術(shù)與軟件工程,2013(10):236.
[7]鄧林強(qiáng),胡欣宇,王昕波.基于多源異構(gòu)信息農(nóng)業(yè)的應(yīng)用與實(shí)現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2017,7(11):60-63.
[8]段繼洲.基于XML的實(shí)驗(yàn)室異構(gòu)數(shù)據(jù)庫同步的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2014.
[9]賈長云.基于XML的異構(gòu)數(shù)據(jù)庫數(shù)據(jù)交換的研究與實(shí)現(xiàn)—校園網(wǎng)信息管理平臺(tái)中的數(shù)據(jù)交換[D].南京:河海大學(xué),2005.
[10]王剛,張江.基于XML的異構(gòu)數(shù)據(jù)庫信息集成的研究與實(shí)現(xiàn)[J].電腦與信息技術(shù),2005,13(1):39-42.