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

圖1 生成簡(jiǎn)單業(yè)務(wù)對(duì)象的過(guò)程
數(shù)據(jù)訪問(wèn)主要提供數(shù)據(jù)庫(kù)中各類對(duì)象的數(shù)據(jù)訪問(wèn)操作、查詢優(yōu)化[9]以及連接池管理。數(shù)據(jù)訪問(wèn)操作包括查詢、增加、修改和刪除,接口類型為對(duì)象類型。查詢優(yōu)化主要包括查詢預(yù)取隊(duì)列和關(guān)鍵對(duì)象緩存:根據(jù)復(fù)雜業(yè)務(wù)對(duì)象描述中對(duì)象操作的執(zhí)行順序,抽取執(zhí)行操作序列中的查詢操作,形成查詢預(yù)取隊(duì)列;在50%以上的復(fù)雜業(yè)務(wù)對(duì)象中存在,且至少存在于兩個(gè)復(fù)雜業(yè)務(wù)對(duì)象中的簡(jiǎn)單對(duì)象稱作關(guān)鍵對(duì)象,將關(guān)鍵對(duì)象存儲(chǔ)在內(nèi)存中形成關(guān)鍵對(duì)象緩存鏈表。連接池管理主要管理數(shù)據(jù)庫(kù)的連接,保證數(shù)據(jù)庫(kù)資源的合理分配。
根據(jù)應(yīng)用的對(duì)象接口請(qǐng)求執(zhí)行對(duì)象的增刪改查操作,具體操作流程如圖2所示。

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

圖3 對(duì)象間的關(guān)聯(lián)關(guān)系
4)數(shù)據(jù)訪問(wèn)根據(jù)復(fù)雜業(yè)務(wù)對(duì)象公共設(shè)施描述中對(duì)象操作的執(zhí)行順序,按照查詢11至查詢13或查詢21至查詢22的順序查詢和預(yù)取對(duì)象數(shù)據(jù),形成查詢預(yù)取隊(duì)列;設(shè)置交通設(shè)施對(duì)象為關(guān)鍵對(duì)象,常駐內(nèi)存中,以提高這個(gè)對(duì)象的數(shù)據(jù)訪問(wèn)速度。
5)按照?qǐng)D3所示的流程,按查詢11至查詢13的查詢操作序列查詢交通設(shè)施對(duì)象,查詢數(shù)據(jù)庫(kù)返回結(jié)果,反射成交通設(shè)施對(duì)象集,根據(jù)預(yù)取隊(duì)列的描述,利用空閑時(shí)間提前執(zhí)行下一個(gè)對(duì)象橋梁對(duì)象的查詢操作,然后用戶可以操作交通設(shè)施對(duì)象及其關(guān)聯(lián)子對(duì)象橋梁,當(dāng)操作橋梁數(shù)據(jù)時(shí),再提前執(zhí)行下一個(gè)對(duì)象機(jī)場(chǎng)對(duì)象的查詢。因?yàn)榻煌ㄔO(shè)施為關(guān)鍵對(duì)象,因此該對(duì)象數(shù)據(jù)駐留在內(nèi)存中。如果用戶更新了交通設(shè)施這個(gè)對(duì)象中的數(shù)據(jù),數(shù)據(jù)訪問(wèn)同時(shí)也要刷新駐留在內(nèi)存的交通設(shè)施對(duì)象數(shù)據(jù)。
通過(guò)復(fù)雜對(duì)象化數(shù)據(jù)訪問(wèn),使專業(yè)人員將精力集中在業(yè)務(wù)邏輯處理上,不必關(guān)心數(shù)據(jù)庫(kù)底層操作的細(xì)節(jié)。由于數(shù)據(jù)訪問(wèn)中的對(duì)象尤其是帶有業(yè)務(wù)流程的復(fù)雜對(duì)象是綜合了軍事指揮控制領(lǐng)域應(yīng)用的數(shù)據(jù)訪問(wèn)需求提煉出來(lái)的,所以具有一定的通用性,該系統(tǒng)可以應(yīng)用到指控領(lǐng)域的各個(gè)項(xiàng)目中去,大大提高項(xiàng)目的開(kāi)發(fā)效率和可擴(kuò)展性。
[1]吳姍姍,彭向陽(yáng).基于XML的通用數(shù)據(jù)庫(kù)訪問(wèn)引擎的設(shè)計(jì)與實(shí)現(xiàn)[J].指揮信息系統(tǒng)與技術(shù),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]高昂,衛(wèi)文學(xué).基于Hibernate與Struts框架的數(shù)據(jù)持久化應(yīng)用研究[J].計(jì)算機(jī)應(yīng)用,2005,25(12):2818-2819.
[5]李斌勇,李慶.基于NHibernate的ORM映射機(jī)制研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009(7):32-34.
[6]萬(wàn)長(zhǎng)鵬,唐慧佳.基于ASP.NET+Castle框架的旅游管理系統(tǒng)的設(shè)計(jì)[J].成都信息工程學(xué)院學(xué)報(bào),2007(4):458-461.
[7]周浩,張祖平.面向?qū)ο蟮某志没夹g(shù)的研究與實(shí)現(xiàn)[J].企業(yè)技術(shù)開(kāi)發(fā),2010(9):4-5.
[8]武亞青.數(shù)據(jù)共享環(huán)境研究[J].指揮信息系統(tǒng)與技術(shù),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]孫衛(wèi)琴.精通Hibernate:java對(duì)象持久化技術(shù)詳解[M].北京:電子工業(yè)出版社,2005:173-176.