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