周微民
(中國電子科技集團公司第二十八研究所 南京 210007)
目前的應用軟件大多通過ODBC、JDBC、ADO、BDE等最原始、最直接的方法訪問數據庫,或是通過數據庫廠商提供的接口訪問數據庫,這些方式雖然運行效率高,但是在程序中嵌入了大量的SQL語句,使得項目難以維護。如果關系數據模型非常復雜,直接寫SQL需要專業的知識,對于企業級應用的開發人員,從頭開發自己的持久化層是不可行的。同時由于數據標準、規范的建設滯后于信息系統的發展,各個信息系統中的數據庫資源都存在著語義、結構等方面的異構性[1],因此需要對象關系映射層,把數據庫訪問操作封裝起來,提供統一的對象接口,供業務調用。
對象/關系映射技術有多種實現,開源項目有 Hibernate[2]、NHibernate[3]、Castle 框 架。Hibernate是 “對 象—關系映射(Object—Relational Mapping,ORM)模塊實現數據持久層的一個優秀的Java組件。ORM元素主要功能是實現實體域對象的持久化并封裝[4]數據訪問的細節。Hibernate對JDBC進行了非常輕量級的封裝,其對象/關系數據庫映射,持久化,事務管理,緩存機制的功能很好,但是Hibernate在復雜多表聯合數據處理上的能力較弱;對于復雜的多表操作不適合用Hibernate。微軟NHibernate是基于Microsoft.NET的O/R Map2ping持久化框架。它從數據庫底層來持久化.Net對象到關系型數據庫。它不僅管理.NET類到數據庫表的映射,還提供數據查詢和獲取數據的方法[5]。但是其中的對象也只是相對比較簡單的主表和幾張子表之間關聯的對象,對象間的復雜關聯無法體現出來。Castle框架是針對.NET平臺的一個非常優秀的開源項目,從數據訪問框架ORM(Object2Relational Mapping,對象關系映射)到IOC(Inversion of Cont rol,控制反轉或者叫依賴注入)容器,再到WEB層的MVC框架,基本包括了整個開發過程中的所有內容,為開發易擴展、可伸縮、靈活、健壯的軟件系統提供了一個很好的平臺[6]。Castle封裝了NHibernate的大部分煩雜細節,不需要像NHibernate那樣去編寫復雜的對象映射文件,配置少且靈活,但是無法支持大型系統復雜的數據庫邏輯。
針對上述不足,本文設計了復雜對象模型以及基于該對象模型的數據快速訪問方案,采用這種方法進行數據庫應用系統開發,將增強系統的數據庫訪問能力和對軟件環境的適應能力,當系統更換底層數據庫系統,或更改數據庫物理表和字段信息時,只需修改對象和數據實體的映射關系,不會對系統產生大的影響。
為了屏蔽數據庫,采用持久化技術。持久化技術的基本思想是以用面向對象的技術將數據庫關系表以及表中的記錄都看成是可以持久的對象。在這種技術中,首先可以利用面向對象的思想,“持久化”包括和數據庫相關的各種操作,并建立其對象模型。例如,保存:把域對象永久保存到數據庫;更新:更新數據庫中的域對象的狀態;刪除:從數據庫中刪除一個域對象;加載:根據特定的OID,把一個域對象從數據庫加載到內存;查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域對象從數據庫加載到內存中[7]。本文根據持久化思想設計了業務對象模型。
業務對象模型是基于元數據庫的,元數據庫主要用于管理元數據。元數據是數據的組織、數據域以及關系的信息,也就是數據的數據[8]。元數據庫主要存儲了用戶需要訪問數據的相關數據對象的描述信息,構成數據庫邏輯視圖,其中數據庫結構信息主要來源于數據字典,即數據庫中用于存儲數據庫對象結構信息的專用表和視圖。
業務對象主要描述業務操作的數據訪問視圖,以XML的方式展現,具體內容包括:
1)對象信息:對象類名稱、對象類描述、數據庫對象ID、對象狀態、對象類型;
2)對象關系映射信息:對象屬性信息、映射的數據庫信息;
3)對象關聯信息:對象內部表間的關聯描述、對象間的關聯描述;
4)對象操作信息。增刪改查的命名SQL:SQL名稱、SQL描述、SQL中的參數描述(包括參數名稱、類型)、SQL的輸出字段別名名稱。級聯操作描述:在增加、修改、刪除記錄操作之前和之后執行的各種命名SQL描述,SQL執行順序號。
復雜對象是基于業務對象的,是簡單業務對象間的關聯關系組合。簡單業務對象間的關聯關系包括兩類:
1)如果一個簡單業務對象A的刪、改、查操作的任一條件字段的值能夠包含在另一個簡單業務對象B的查詢結果中,可以認為B與A之間存在父子關系;
2)如果兩個簡單業務對象A和A′,都是簡單業務對象B的子對象,則可以認為A和A′存在兄弟關系。
對象化數據訪問主要由業務對象和數據訪問兩個部分組成。業務對象根據實際應用的數據需求分為簡單業務對象和復雜業務對象,主要存儲對象和數據庫表之間的映射關系;數據訪問主要通過動態加載業務對象來完成用戶對數據庫數據的操作。
對象化數據訪問的主要工作流程為:先抽取專業數據庫結構到元數據庫中,形成數據庫邏輯視圖;再利用元數據庫生成簡單業務對象,描述業務操作的數據訪問視圖;然后分析生成的多個簡單業務對象間的關聯關系,根據業務需要設置對象間的關聯關系生成復雜業務對象,描述業務流程的數據訪問視圖;最后完成對象的數據訪問。
2.2.1 業務對象的生成
業務對象是依托元數據庫的,所以要先構建元數據庫,然后再生成業務對象。
1)抽取元數據
根據數據模型的描述,從專業數據庫的數據字典讀取需要訪問數據的相關數據對象(包括數據表、字段、約束等)的描述信息,存入元數據庫中,為業務對象的生成提供支持。主要步驟如下:
(1)讀取專業數據庫的連接信息;
(2)讀取專業數據庫里表的描述信息;
(3)讀取專業數據庫里表字段的描述信息;
(4)讀取專業數據庫里表的關聯信息;
(5)將專業數據庫的元數據描述信息存入元數據庫,供生成業務對象時使用。
該操作需要了解數據模型的人員參與選擇數據表和其他對象的范圍,需要根據應用要求增加或修改表的關聯關系或字段的取值范圍等,保存在元數據中,供后面生成對象時使用該邏輯關聯。對專業數據庫的元數據描述包括:
(1)數據表信息:表名稱、字段組成、主鍵字段;
(2)字段信息:字段名稱、字段類型、字段長度、是否非空;
(3)關聯關系:主子表的關聯信息。
2)生成簡單業務對象
從元數據模型中讀取數據表信息及其關聯表信息,以人機交互方式供用戶選擇與具體業務操作相關的一組表及其關心字段;根據用戶選擇的表和字段信息,及其元數據描述,自動生成對表間關聯關系、讀取順序的描述,以及默認的級聯增刪改查操作的SQL語句。允許用戶以人機交互方式修改默認生成的SQL語句,支持SQL的修改、增加、刪除,支持以參數形式定義SQL查詢條件,保存業務對象信息到XML中。具體操作流程如圖1所示。
3)生成復雜業務對象
根據分析的2.2.1節中用戶定義的一組簡單業務對象的關聯關系,生成對象樹。可能存在多棵對象樹;根據對簡單業務對象樹的深度和廣度兩種遍歷方式,生成供用戶參考的對象訪問操作執行順序鏈表。用戶通過人機交互方式確定業務工作流程中可能存在的一種或多種對象操作的訪問操作執行順序,還可以給出選擇某種執行順序的條件或優先級;與某個工作流程相關的一組簡單對象,構成復雜業務對象,同樣以XML存儲,XML中包含以下信息:
(1)包含的簡單業務對象列表,引用位置。
(2)描述簡單業務對象間的父子關系或兄弟關系,描述建立上述關系的表和字段。
(3)描述簡單對象訪問操作的執行順序,及選擇某種執行順序的條件或優先級。
2.2.2 數據訪問

圖1 生成簡單業務對象的過程
數據訪問主要提供數據庫中各類對象的數據訪問操作、查詢優化[9]以及連接池管理。數據訪問操作包括查詢、增加、修改和刪除,接口類型為對象類型。查詢優化主要包括查詢預取隊列和關鍵對象緩存:根據復雜業務對象描述中對象操作的執行順序,抽取執行操作序列中的查詢操作,形成查詢預取隊列;在50%以上的復雜業務對象中存在,且至少存在于兩個復雜業務對象中的簡單對象稱作關鍵對象,將關鍵對象存儲在內存中形成關鍵對象緩存鏈表。連接池管理主要管理數據庫的連接,保證數據庫資源的合理分配。
根據應用的對象接口請求執行對象的增刪改查操作,具體操作流程如圖2所示。

圖2 對象數據訪問及優化的流程
1)如果是查詢操作,步驟如下:
(1)如果查詢對象不在緩存中,則從數據庫獲取查詢結果,反射成對象集,如果該對象在關鍵對象緩存鏈表中,則將對象集數據駐留在緩存中;再根據查詢預取隊列,獲得下一個對象查詢操作,利用空閑時間提前執行。
(2)如果查詢對象數據已經在緩存中,則不訪問數據庫,直接從緩存中獲取對象。
(3)然后操作對象本身及其關聯的對象。
2)如果是對象的增刪改操作,則根據復雜對象文件的級聯配置執行級聯操作,提交數據庫。如果未設置級聯關系,則執行單表操作,提交數據庫;如果執行增刪改操作的對象是關鍵對象,則還需根據增刪改結果更新緩存中的對象數據。
在對象關系映射系統中,對象預取與緩存技術可以提高用戶對持久化對象的訪問效率。
通過某種策略預測將來可能會被訪問到的對象,并預先將這些對象讀取到客戶端。如果預測對象在后面確實被訪問到了,那么預取策略會有效的減少數據訪問到數據庫查詢對象的操作,提高數據訪問性能。相反,如果預取對象沒有被訪問到,則會降低系統的性能,所以制定合理的預取策略是至關重要的。
本方案是通過抽取復雜對象操作序列中的查詢操作形成查詢預取隊列來構建預取策略的。在生成復雜對象的過程中,用戶可以使用和修改定制默認生成的簡單對象間關聯關系,根據復雜對象中關聯關系的描述,可以構建出多個查詢預取隊列。因為用戶根據實際數據需求參與關聯關系的確定,所以查詢預取隊列中的對象被訪問的機率是很大的甚至是100%。當用戶查詢某個對象A時,后臺會繼續查詢隊列中的下一個對象B,當操作到對象B的數據時,后臺會繼續查詢B的下一個對象C的數據,以提高查詢的速度。當用戶獲取到一個對象查詢數據后,可以在內存中獲取隊列中下一個對象的數據,減少了再去查詢數據庫的時間。
在實際應用中,頻繁地訪問數據庫,會對應用的性能造成很大影響。為了降低訪問數據庫的頻率,可以把需要經常被訪問的業務數據存放在緩存中,并且通過特定的機制來保證緩存中的數據與數據庫數據同步[10]。本方案的緩存思想是抽取所有對象中的關鍵對象形成緩存對象鏈表,對鏈表中的對象數據進行本地緩存和實時更新。在用戶的第一次查詢中,如果發現查詢對象是鏈表中的關鍵對象,則將查詢結果對象駐留在內存中,供其它應用再次查詢時直接使用,減少訪問數據庫的時間。當用戶通過關鍵對象的修改接口更新關鍵對象的數據到數據庫后,數據訪問也同步更新緩存中的關鍵對象數據,保證內存塊中關鍵對象的數據最新。
復雜對象的數據訪問在某項目中的使用示例步驟如下:
1)用戶抽取業務數據庫模型到元數據庫中,形成數據庫邏輯視圖。
2)基于元數據模型,生成交通設施對象,選擇關心的一張主表交通設施及其關聯表,選擇主表中所有字段和關聯表中名稱字段,自動生成關聯的查詢SQL,主子表級聯操作的增刪改SQL。
生成橋梁對象,選擇表中的字段交通設施內碼、橋長、橋寬、水深、歸屬地區、可??看淖畲髧嵨坏?,再在提示的關聯表中選擇交通設施表,選擇關聯屬性交通設施名稱,自動生成關聯的查詢SQL,主子表級聯操作的增刪改SQL。類似地生成機場對象。
生成人防設施對象,用戶通過業務對象生成工具瀏覽專業庫中的數據表,選擇關心的一張主表人防設施表,選擇表中的字段人防設施內碼、防護等級ID(關聯防護等級表)、建筑面積、管理單位、可儲藏人數、其它描述,質量現狀ID(關聯質量現狀表)等,再在提示的關聯表中選擇防護等級表、質量現狀表,選擇關聯屬性防護等級名稱字段和質量現狀描述字段,自動生成關聯的查詢SQL,主子表級聯操作的增刪改SQL。
3)由2)生成的4個對象構建的樹形成復雜對象公共設施,構建兩個查詢預取隊列:查詢11、查詢12、查詢13和查詢21、查詢22,如圖3所示。針對制作好的一系列對象生成對象接口動態庫文件,用戶調用對象的增刪改查接口用于數據訪問。

圖3 對象間的關聯關系
4)數據訪問根據復雜業務對象公共設施描述中對象操作的執行順序,按照查詢11至查詢13或查詢21至查詢22的順序查詢和預取對象數據,形成查詢預取隊列;設置交通設施對象為關鍵對象,常駐內存中,以提高這個對象的數據訪問速度。
5)按照圖3所示的流程,按查詢11至查詢13的查詢操作序列查詢交通設施對象,查詢數據庫返回結果,反射成交通設施對象集,根據預取隊列的描述,利用空閑時間提前執行下一個對象橋梁對象的查詢操作,然后用戶可以操作交通設施對象及其關聯子對象橋梁,當操作橋梁數據時,再提前執行下一個對象機場對象的查詢。因為交通設施為關鍵對象,因此該對象數據駐留在內存中。如果用戶更新了交通設施這個對象中的數據,數據訪問同時也要刷新駐留在內存的交通設施對象數據。
通過復雜對象化數據訪問,使專業人員將精力集中在業務邏輯處理上,不必關心數據庫底層操作的細節。由于數據訪問中的對象尤其是帶有業務流程的復雜對象是綜合了軍事指揮控制領域應用的數據訪問需求提煉出來的,所以具有一定的通用性,該系統可以應用到指控領域的各個項目中去,大大提高項目的開發效率和可擴展性。
[1]吳姍姍,彭向陽.基于XML的通用數據庫訪問引擎的設計與實現[J].指揮信息系統與技術,2010(1):55-59.
[2]Christian Bauer,Gavin King.Hibernate in Action[M].USA:Manning Publication,2004:15-26.
[3]Pierre Henri Kuaté,Christian Bauer,Gavin King.NHibernate In Action[M].Manning Publications,2007:36-40.
[4]高昂,衛文學.基于Hibernate與Struts框架的數據持久化應用研究[J].計算機應用,2005,25(12):2818-2819.
[5]李斌勇,李慶.基于NHibernate的ORM映射機制研究[J].計算機技術與發展,2009(7):32-34.
[6]萬長鵬,唐慧佳.基于ASP.NET+Castle框架的旅游管理系統的設計[J].成都信息工程學院學報,2007(4):458-461.
[7]周浩,張祖平.面向對象的持久化技術的研究與實現[J].企業技術開發,2010(9):4-5.
[8]武亞青.數據共享環境研究[J].指揮信息系統與技術,2011(2):35-40.
[9]Ben Wiedermann,William R C.Extracting queries by static analysis of t ransparent persiste nce[J].ACM SIGPLAN Notices,2007,42(1):199-210.
[10]孫衛琴.精通Hibernate:java對象持久化技術詳解[M].北京:電子工業出版社,2005:173-176.