圣文順 喬雨 邵琳潔



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