, ,
(1.江南大學(xué)信息工程學(xué)院,江蘇 無(wú)錫 214122;2.中國(guó)船舶科學(xué)研究中心,江蘇 無(wú)錫 214082)
信息化和網(wǎng)絡(luò)化成為企業(yè)發(fā)展的趨勢(shì),這個(gè)趨勢(shì)也對(duì)數(shù)據(jù)的可視化提出了更高的要求。
傳統(tǒng)的JAVA圖形開發(fā)方案滿足不了實(shí)際的需要,對(duì)比圖1a)、b),圖1a)在船舶數(shù)據(jù)可視化中顯示的細(xì)節(jié)、效果、精度、色彩等方面明顯優(yōu)越于圖1b)。
以前的系統(tǒng)大都是單機(jī)版,許多關(guān)鍵的信息被封閉在相互獨(dú)立的系統(tǒng)中,滿足不了船舶科研、設(shè)計(jì)、制造業(yè)共享數(shù)據(jù)信息的需要。因此,引入了新的圖形開發(fā)工具:Autodesk DWF。由于DWF文件高度壓縮,只有同規(guī)模數(shù)據(jù)CAD大小的八分之一,可以在網(wǎng)絡(luò)上進(jìn)行發(fā)布,適合在網(wǎng)絡(luò)上進(jìn)行傳輸,傳輸速度快,同時(shí),可用于交流豐富的設(shè)計(jì)數(shù)據(jù),而無(wú)需一般CAD圖形相關(guān)的網(wǎng)絡(luò)開銷。
a) DWF圖形
b) JAVA圖形圖1 圖形對(duì)比
系統(tǒng)結(jié)構(gòu)設(shè)計(jì)見圖2。
圖2 系統(tǒng)結(jié)構(gòu)
結(jié)合圖2,用戶通過平臺(tái)軟件接口系統(tǒng)登錄,輸入需要查詢的船舶編號(hào)。系統(tǒng)響應(yīng)請(qǐng)求,把信息傳遞給Web服務(wù)器中的命令解析模塊,確定該用戶是否具有查看DWF圖形的權(quán)限,并對(duì)用戶提交的信息進(jìn)行解釋和進(jìn)一步的整合、加工,再傳遞給應(yīng)用服務(wù)器中的應(yīng)用模塊,應(yīng)用模塊響應(yīng)消息,調(diào)用圖形處理模塊對(duì)信息進(jìn)行處理,并從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。
如果此船舶數(shù)據(jù)滿足生成圖形的需要,則會(huì)有提示,同時(shí)生成圖形并返回正確地結(jié)果,并提供Autodesk DWF Viewer插件的下載,以顯示船舶型線圖。對(duì)一些特權(quán)用戶同時(shí)提供同一船舶數(shù)據(jù)的下載。
沒有圖形可顯示,則返回相關(guān)的數(shù)據(jù)信息。
數(shù)據(jù)的存儲(chǔ)速度和處理效率等問題是Web系統(tǒng)非常關(guān)鍵的一個(gè)方面。在這里對(duì)Hibernate框架本身進(jìn)行調(diào)優(yōu),對(duì)ORAELE數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化和改造。
2.1.1 Hibernate性能調(diào)優(yōu)
由于使用的是Hibernate框架,采用的是ORM(對(duì)象關(guān)系映射),這就決定了數(shù)據(jù)庫(kù)的設(shè)計(jì)。對(duì)數(shù)據(jù)庫(kù)中大表進(jìn)行操作時(shí),利用Hibernate,傾向于細(xì)顆粒度的設(shè)計(jì)[1],面向?qū)ο螅瑢⒋蟊聿鸱譃槎鄠€(gè)關(guān)聯(lián)關(guān)系的小表,消除冗余column,通過二級(jí)緩存提升性能(DBA比較忌諱關(guān)聯(lián)關(guān)系的出現(xiàn),但是ORM的緩存將突破關(guān)聯(lián)關(guān)系的性能瓶頸),可以最大程度的提升代碼的重用性;Hibernate的性能瓶頸不在于關(guān)聯(lián)關(guān)系,而在于大表的操作。
細(xì)顆粒度,針對(duì)表的記錄級(jí)別,透明化訪問,在不改變程序代碼的情況下可以極大提升Web應(yīng)用的性能。也可以適當(dāng)?shù)募尤胍恍㎎DBC語(yǔ)句,和Hibernate結(jié)合。
2.1.2 在ORACLE數(shù)據(jù)庫(kù)中使用視圖
本系統(tǒng)在對(duì)數(shù)據(jù)進(jìn)行操作處理時(shí),也涉及到多個(gè)表的情況。如果不對(duì)表進(jìn)行任何處理,利用表之間的關(guān)系直接查詢,則會(huì)對(duì)無(wú)用數(shù)據(jù)也進(jìn)行查詢,造成數(shù)據(jù)的冗余,減慢了速度,犧牲了效率,讓用戶明顯感覺速度慢。因此,在ORACLE數(shù)據(jù)庫(kù)中,創(chuàng)建視圖,對(duì)有用數(shù)據(jù)進(jìn)行整合加工,按照需求設(shè)置一些派生的屬性列。這樣既可以簡(jiǎn)化數(shù)據(jù)庫(kù)結(jié)構(gòu),也可以簡(jiǎn)化數(shù)據(jù)的查詢操作,同時(shí)可以讓用戶從不同的角度去對(duì)待同一數(shù)據(jù),提升數(shù)據(jù)的靈活性和邏輯獨(dú)立性。
上面兩種方法的結(jié)合,最大程度地提高了數(shù)據(jù)的存儲(chǔ)效率,使整個(gè)Web系統(tǒng)在數(shù)據(jù)操作方面達(dá)到了最優(yōu)。
有了高效率的數(shù)據(jù)操作方法,則可以利用其對(duì)數(shù)據(jù)進(jìn)行所需要的操作。
2.2.1 引入PRO*C技術(shù)
針對(duì)系統(tǒng)的需求,引入了PRO*C技術(shù)。在圖形程序中加入直接從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)的功能,用DLL直接進(jìn)行封裝,減少數(shù)據(jù)的包裝次數(shù)。
2.2.2 數(shù)據(jù)的獲得
利用PRO*C技術(shù),先把需要查詢的程序在VC的.pc文件中以PRO*C語(yǔ)法寫出。
1) 連接數(shù)據(jù)庫(kù)。
2) 查詢和獲得數(shù)據(jù),然后從宿主變量中取出數(shù)據(jù),放在自己定義的數(shù)據(jù)結(jié)構(gòu)中,配置好環(huán)境,通過ORACLE數(shù)據(jù)庫(kù)自帶的預(yù)編譯工具,把代碼編譯成C++源碼,可以直接在圖形程序中對(duì)其進(jìn)行調(diào)用。
3) 與數(shù)據(jù)庫(kù)斷開連接。
2.2.3 數(shù)據(jù)的傳遞
因?yàn)槭窃赩C圖形程序中獲得數(shù)據(jù),而且在VC.NET平臺(tái)下直接使用了PRO*C技術(shù)對(duì)ORACLE數(shù)據(jù)庫(kù)直接進(jìn)行操作,使得對(duì)數(shù)據(jù)的封裝次數(shù)減少,而且不需要對(duì)JAVA和C++之間的數(shù)據(jù),類型進(jìn)行過多的轉(zhuǎn)換,無(wú)形當(dāng)中也提高了存取數(shù)據(jù)的速度。
在本系統(tǒng)中,J2EE平臺(tái)需要做的只是傳遞一個(gè)船舶的編號(hào)進(jìn)入圖形DLL,就可以實(shí)現(xiàn)圖形的生成和查看。
1) 結(jié)合參考文獻(xiàn)[2]中提供的對(duì)非均勻B樣條算法(NURBS)的升階,插值等成果,在程序中加強(qiáng)對(duì)邊界條件的控制。
2) 利用功能函數(shù),第一個(gè)是數(shù)據(jù)處理函數(shù)DataOperation,把從數(shù)據(jù)庫(kù)中讀出的數(shù)據(jù)從新整合和加工,讓數(shù)據(jù)的組織方式滿足船舶的水線、站線和縱剖線三大塊的需要,使三者可以獨(dú)立被操作而互相不影響;另外一個(gè)函數(shù)是Calc_ControlPoints,調(diào)用算法求控制點(diǎn),并為控制點(diǎn)賦值。讀取數(shù)據(jù)后,就可以根據(jù)船舶的型值點(diǎn)利用Calc_ControlPoints計(jì)算出控制點(diǎn),然后再根據(jù)控制點(diǎn)畫出對(duì)應(yīng)的曲線。Calc_ControlPoints被圖形的整體建模函數(shù)調(diào)用,用于圖形的整體建模。
3) 入口函數(shù)對(duì)數(shù)據(jù)處理函數(shù)和圖形整體建模函數(shù)進(jìn)行調(diào)用,對(duì)兩者加以整合,只需傳送一個(gè)數(shù)據(jù)庫(kù)中存在的船舶的編號(hào),就可以生成相應(yīng)的船舶型線圖。
阻礙Java獲得廣泛應(yīng)用的一個(gè)主要因素是其運(yùn)行效率。Java是介于解釋型和編譯型之間的一種語(yǔ)言,同樣的程序,如果用編譯型語(yǔ)言C++來(lái)實(shí)現(xiàn),其運(yùn)行速度一般要比Java快一倍以上。Java具有平臺(tái)無(wú)關(guān)性,但是性能方面的因素又大大削弱了它的競(jìng)爭(zhēng)力。為此,提高Java的性能就顯得十分重要。
因此,利用Java開發(fā)的Web信息系統(tǒng),通過網(wǎng)絡(luò)傳輸,最后在客戶端顯示船舶性能曲線、以及船型型線的三維圖片,對(duì)圖片的顯示的精確度要求很高。而圖片生成是Java開發(fā)的不足之處,特別是圖片顯示的效果、精度都不夠。綜合系統(tǒng)的要求,引入了JNI(java native interface),利用混合編程技術(shù),在Java程序中調(diào)用VC++環(huán)境下開發(fā)的DWF圖形。在發(fā)揮Java語(yǔ)言Web服務(wù)端跨平臺(tái)性的同時(shí),利用C++語(yǔ)言的高效性與DWF數(shù)據(jù)量小、安全性高的結(jié)合。項(xiàng)目中JNI技術(shù)的應(yīng)用實(shí)現(xiàn)見圖3。
圖3 JNI實(shí)現(xiàn)框
1) 編寫需要JNI功能的Java類源文件。其中,需要JNI實(shí)現(xiàn)的方法用native關(guān)鍵字聲明。在該類中,用System.loadLibrary()方法加載需要的動(dòng)態(tài)鏈接庫(kù)。
2) 上面生成的只是SSH框架下的Java類,要想與VC平臺(tái)之間進(jìn)行平臺(tái)之間的信息通信,必須在兩者之間建立一個(gè)“橋梁”,把Java的信息注入到VC的DLL中去,由DOC環(huán)境完成。將該類源文件用Java類編譯器編譯成二進(jìn)制字節(jié)碼文件。由于采用了native關(guān)鍵字聲明,編譯器會(huì)忽視沒有代碼體的JNI方法部分。
3) 完成平臺(tái)之間的通信,需要提供包含JNI元素的DLL以實(shí)現(xiàn)在J2EE平臺(tái)下的調(diào)用,生成圖形。由于圖形是直接在VC.NET環(huán)境下開發(fā),只需對(duì)VC和Java之間的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,對(duì)程序只需要進(jìn)行一次DLL的封裝就可以。這個(gè)需要DWF庫(kù)的支持。
新建DLL工程,把圖形的工程文件以及生成的Java W3D類的頭文件放到DLL工程中去,加載用到的外部DWF開發(fā)包。直接對(duì)工程的DLL封裝,需要有一個(gè)入口函數(shù),提供調(diào)用入口和平臺(tái)之間的數(shù)據(jù)類型轉(zhuǎn)換,所以把原圖形的入口函數(shù)作為DLL的入口函數(shù),其名稱要與W3D類的頭文件中的函數(shù)名一致。
對(duì)于DLL的 調(diào)用,有兩個(gè)途徑,一個(gè)是把DLL放到系統(tǒng)的system32文件夾下面,利用默認(rèn)的系統(tǒng)變量直接調(diào)用;另一個(gè)是把DLL存放到指定的位置,需要把DLL所在位置的路徑配置到用戶環(huán)境變量里面才可以進(jìn)行DLL的調(diào)用。
雖然在本地返回 Java 后將自動(dòng)釋放局部引用,但過多的局部引用將使虛擬機(jī)在執(zhí)行本地方法時(shí)耗盡內(nèi)存。在訪問系統(tǒng)的用戶比較少時(shí)問題不明顯,一旦多個(gè)遠(yuǎn)程用戶同時(shí)訪問系統(tǒng),超過Java虛擬機(jī)能夠承受的系統(tǒng)內(nèi)存范圍后,系統(tǒng)就會(huì)崩潰。
為了很好地解決這個(gè)問題,筆者在整個(gè)系統(tǒng)框架中引入了“數(shù)據(jù)庫(kù)事務(wù)與并發(fā)”機(jī)制,利用數(shù)據(jù)庫(kù)本身來(lái)對(duì)Java本地引用進(jìn)行控制。
由于在Web系統(tǒng)中圖形數(shù)據(jù)的取得是由幾個(gè)固定的SQL 語(yǔ)句來(lái)完成,每個(gè)用戶訪問數(shù)據(jù)執(zhí)行讀圖程序時(shí),都可以看作為一個(gè)事務(wù)[1],多個(gè)用戶同時(shí)訪問系統(tǒng),執(zhí)行同一個(gè)Java本地引用操作時(shí),等同與事物的并發(fā)執(zhí)行,通過程序把這些操作歸結(jié)為一類事務(wù),利用隔離性(數(shù)據(jù)庫(kù)系統(tǒng)隔離并發(fā)運(yùn)行的各個(gè)事務(wù)的能力),設(shè)置隔離級(jí)別,分別為:Serializable(串行化)、Repeatable Read(可重復(fù)讀)、Read Commited(讀已提交數(shù)據(jù))、Read Uncommited(讀未提交數(shù)據(jù)),隔離級(jí)別依次由高到低。其隔離級(jí)別與并發(fā)性關(guān)系見圖4。
圖4 隔離級(jí)別與并發(fā)性能的關(guān)
隔離級(jí)別越高,對(duì)并發(fā)性的影響也越大。
對(duì)數(shù)據(jù)庫(kù)的最大事務(wù)執(zhí)行數(shù)量進(jìn)行設(shè)置。當(dāng)用戶訪問量超出最大可執(zhí)行事務(wù)數(shù)量時(shí),系統(tǒng)會(huì)自動(dòng)提示用戶等待。既保證了數(shù)據(jù)的及時(shí)性,安全性和完整性,也防止了因?yàn)檫^多的Java本地引用而造成的內(nèi)存耗盡、系統(tǒng)崩潰。
這樣,大量用戶同時(shí)訪問系統(tǒng)時(shí),程序結(jié)合數(shù)據(jù)庫(kù)本身,既保證了系統(tǒng)的高效率,又有效地保證了系統(tǒng)的安全。
系統(tǒng)提供了自動(dòng)下載Autodesk DWF Viewer插件的功能[4]。通過這個(gè)插件,可以查看船舶型線的每一個(gè)細(xì)節(jié)。網(wǎng)頁(yè)中打開船舶型線圖的效果見圖5。
圖5 3D船舶型線圖
此系統(tǒng)已經(jīng)投入運(yùn)行,為船舶結(jié)構(gòu)研究、船舶設(shè)計(jì)、船舶制造等方面的工作提供了大量的原型和數(shù)據(jù),使得不同部門之間可以共享船舶模型原型和數(shù)據(jù),大大提高了科研、設(shè)計(jì)、生產(chǎn)之間的緊密結(jié)合。
[1] 孫衛(wèi)琴.精通Hibernate:JAVA對(duì)象持久化技術(shù)詳解[M].北京:電子工業(yè)出版社,2005.
[2] 陳紹平,陳賓康.組合曲線的NURBS表示及其應(yīng)用[J].武漢理工大學(xué)學(xué)報(bào):交通科學(xué)與工程版,2005,29(4):475-477.
[3] 徐 陽(yáng),鐘 崴,童水光.基于Autodesk DWFⅥewer的圖形化標(biāo)注系統(tǒng)[J].計(jì)算機(jī)工程,2007,33(2):227-229.