摘 要: 通過對影響EJB性能因素的分析,給出了對EJB應(yīng)用程序調(diào)優(yōu)的策略和方法,并詳細(xì)說明了采用會(huì)話外觀模式的EJB設(shè)計(jì)模式后對系統(tǒng)性能的影響。會(huì)話外觀模式簡化了Web容器和EJB容器之間的耦合,減少了在網(wǎng)絡(luò)邊界上的調(diào)用過程,同時(shí)實(shí)現(xiàn)了對安全權(quán)限和事務(wù)的集中管理。
關(guān)鍵詞: EJB;性能優(yōu)化;會(huì)話外觀模式;耦合
?
目前,軟件設(shè)計(jì)大多采用多層體系架構(gòu),實(shí)現(xiàn)了應(yīng)用層與用戶層分離,這種架構(gòu)形式具有更強(qiáng)的通用性和兼容性,提高了系統(tǒng)的性能和功能。
??? 在多層體系架構(gòu)的應(yīng)用層中,由于傳統(tǒng)的COM+(Component Object Model)組件技術(shù)的移植性和通用性比較有限,一般都采用J2EE的關(guān)鍵技術(shù)——EJB組件技術(shù),該技術(shù)已得到世界上大多數(shù)廠家的支持,使系統(tǒng)的升級、開發(fā)過程中有更大的選擇空間。
由于EJB組件技術(shù)作為J2EE系統(tǒng)技術(shù)的基礎(chǔ),所以選擇不同的EJB組件模型和設(shè)計(jì)模式,在很大程度上可以影響EJB應(yīng)用程序的整體性能,通常整體性能是被很小的一部分的代碼所決定。本文通過對影響EJB性能因素的分析,給出了EJB應(yīng)用程序調(diào)優(yōu)的策略和方法。并詳細(xì)說明了采用一種會(huì)話外觀模式的EJB設(shè)計(jì)模式后對系統(tǒng)性能的影響。
1 影響EJB性能的因素
影響EJB應(yīng)用程序性能的因素包括以下幾點(diǎn):
??? (1)網(wǎng)絡(luò)帶寬和網(wǎng)絡(luò)業(yè)務(wù)的數(shù)量:如果網(wǎng)絡(luò)帶寬偏低而網(wǎng)絡(luò)業(yè)務(wù)較高,則應(yīng)用服務(wù)器上的最優(yōu)化的EJB應(yīng)用程序也變得低效。
??? (2)硬件和操作系統(tǒng):硬件和操作環(huán)境直接影響應(yīng)用服務(wù)器的可伸縮性和性能,從而影響EJB應(yīng)用程序的性能。
??? (3)應(yīng)用服務(wù)器(和它們的配置)專有特性、可伸縮性的性能:應(yīng)用程序的運(yùn)行也依賴于運(yùn)行應(yīng)用程序的應(yīng)用服務(wù)器,應(yīng)用服務(wù)器的品牌、配置和設(shè)置都會(huì)影響應(yīng)用服務(wù)器的性能和伸縮性,從而影響EJB應(yīng)用程序的性能和伸縮性。
??? (4)EJB應(yīng)用程序部署商為特定的應(yīng)用服務(wù)器優(yōu)化應(yīng)用程序的知識(shí)和經(jīng)驗(yàn):如果部署商沒有為操作環(huán)境和應(yīng)用程序服務(wù)器優(yōu)化地設(shè)置、部署參數(shù),那么即使是最優(yōu)化的EJB應(yīng)用程序也會(huì)拙劣的執(zhí)行。
??? (5)EJB應(yīng)用程序的設(shè)計(jì)和實(shí)現(xiàn):一般情況下,Bean開發(fā)人員無法控制網(wǎng)絡(luò)帶寬、使用的硬件類型和應(yīng)用服務(wù)器的品牌。但能夠做的是:盡力地優(yōu)化EJB以實(shí)現(xiàn)提高性能;分析裝配參數(shù)的優(yōu)化設(shè)置向裝配商和部署商提供盡可能多的信息。
2 EJB應(yīng)用程序的設(shè)計(jì)決策
??? 所謂EJB設(shè)計(jì)決策主要是如何選擇3種Bean:實(shí)體Bean、會(huì)話Bean和消息驅(qū)動(dòng)Bean;如何選擇BMP和CMP;如何選擇本地接口和遠(yuǎn)程接口[1,2,9]。
??? 3種Bean的選擇:如果事務(wù)中要編譯和維護(hù)數(shù)據(jù),就要選擇實(shí)體Bean,如果數(shù)據(jù)時(shí)間上是數(shù)據(jù)的瞬像,則可使用無狀態(tài)的會(huì)話Bean,并從實(shí)體Bean中取得信息,返回?cái)?shù)值對象。會(huì)話Bean表示業(yè)務(wù)過程,可以維護(hù)所有的業(yè)務(wù)邏輯,包括數(shù)據(jù)驗(yàn)證。消息驅(qū)動(dòng)Bean主要用于異步通信的過程中。
??? 有狀態(tài)的會(huì)話Bean和無狀態(tài)的會(huì)話Bean的選擇:有狀態(tài)的會(huì)話Bean需要更多的服務(wù)器資源,它在方法調(diào)用之間維護(hù)數(shù)據(jù)。無狀態(tài)的會(huì)話Bean需要更多的網(wǎng)絡(luò)資源,每次調(diào)用遠(yuǎn)程方法時(shí),需要的所有相關(guān)數(shù)據(jù)都要以參數(shù)的形式傳入。
??? BMP和CMP的選擇:CMP可以減少代碼的編寫量,而且允許容器進(jìn)行很多優(yōu)化,用容器實(shí)現(xiàn)持久性處理邏輯,具有較強(qiáng)的移植性。而BMP中包含數(shù)據(jù)庫訪問代碼,可以更好地控制數(shù)據(jù)實(shí)現(xiàn),但額外的代碼編寫量大,移植性差。
??? 遠(yuǎn)程接口和本地接口的選擇:本地接口可以減少開銷量,允許本地組件進(jìn)行本地通信,在調(diào)用方法和參數(shù)中按引用對象傳遞,本地接口的對象不需要支持RMI-IIOP協(xié)議,傳遞速度快。遠(yuǎn)程接口的對象在調(diào)用中按數(shù)值傳遞,提供了一個(gè)遠(yuǎn)程的、與位置無關(guān)的視圖必須實(shí)現(xiàn)RMI接口,造成較大的延遲。
3 調(diào)優(yōu)EJB應(yīng)用程序的策略
3.1 減少遠(yuǎn)程調(diào)用
和EJB的分布式結(jié)構(gòu)有關(guān)的主要性能的關(guān)注點(diǎn)就是它所需要的網(wǎng)絡(luò)通信量。當(dāng)遠(yuǎn)程客戶機(jī)對EJB進(jìn)行調(diào)用時(shí),需要借助RMI-IIOP協(xié)議,從而需要一定量的網(wǎng)絡(luò)開銷。其中包括客戶機(jī)與容器之間通過網(wǎng)絡(luò)傳遞數(shù)據(jù)的開銷。減少網(wǎng)絡(luò)開銷的方法有兩種:一種是將會(huì)話Bean作為實(shí)體Bean的前端,前端會(huì)話Bean通過對實(shí)體Bean的調(diào)用是本地方法調(diào)用,從而可以避免大量網(wǎng)絡(luò)通信的開銷。另外這樣可以將表示邏輯與業(yè)務(wù)邏輯分離,從而降低了EJB的復(fù)雜性。另一種是盡量使用本地接口,使用引用傳遞參數(shù)避免了調(diào)用和解調(diào)用的開銷,從而減少了不必要的網(wǎng)絡(luò)業(yè)務(wù)[3,7,10]。
3.2 使用適當(dāng)?shù)腅JB設(shè)計(jì)模式[4,7,11]
??? 設(shè)計(jì)模式可以認(rèn)為是藍(lán)圖或模板解決方案,這些解決方案可以容易地修改以解決在環(huán)境中重復(fù)發(fā)生的問題。設(shè)計(jì)模式的使用可以節(jié)省時(shí)間和精力。使用驗(yàn)證過的設(shè)計(jì)模式解決特定類型的問題。模式由以下元素組成:
??? (1)模式名稱:簡潔地表達(dá)了模式的本質(zhì)。
??? (2)背景:問題發(fā)生的環(huán)境。
??? (3)問題:對待解決問題的細(xì)節(jié)描述。
??? (4)用途:有關(guān)形成模式的動(dòng)機(jī)和基本原理的列表。
??? (5)解決方案:描述解決問題的方式,用類圖和順序圖解釋它們的結(jié)構(gòu)。
??? (6)參與者及其職責(zé):模式中所有對象的列表。
??? EJB設(shè)計(jì)模式分為:數(shù)據(jù)訪問對象模式、值對象模式、值對象裝配器模式、值對象列表處理程序模式、服務(wù)定位器模式、會(huì)話外觀模式、業(yè)務(wù)對象代表模式等7種模式。
??? 可以根據(jù)不同的實(shí)際問題應(yīng)用不同的模式。值對象模式通過減少對實(shí)體Bean的精細(xì)調(diào)用而降低潛在的網(wǎng)絡(luò)通信量,同時(shí)通過簡單地訪問Bean的字段值給客戶端提供實(shí)體Bean,特別應(yīng)用到遠(yuǎn)程客戶端訪問實(shí)體Bean的情況。
??? 會(huì)話外觀模式允許開發(fā)人員給客戶端和表示層通過會(huì)話Bean提供大致的EJB事務(wù)邏輯訪問。這種模式向客戶提供了一個(gè)統(tǒng)一的訪問層和接口,負(fù)責(zé)定位、創(chuàng)建執(zhí)行業(yè)務(wù)對象中的業(yè)務(wù)邏輯。使用會(huì)話Bean來封裝和隱藏參與業(yè)務(wù)流程的業(yè)務(wù)對象之間交互的復(fù)雜性。
4 會(huì)話外觀模式
??? 采用Grinder測試工具測試開發(fā)的原型EJB,Grinder的默認(rèn)行為是發(fā)布客戶的HTTP請求,然后模擬瀏覽器請求Web服務(wù)器,通過建立1個(gè)輕便的分配器Servlet,將Web服務(wù)器上的請求給EJB容器。這樣可以很好地模仿的現(xiàn)實(shí)中的情況,如圖1所示。
?
4.1 測試配置及測試腳本摘錄
??? 所有的測試在三臺(tái)機(jī)器上運(yùn)行:一臺(tái)運(yùn)行 Grinder及其線程,另一臺(tái)運(yùn)行應(yīng)用服務(wù)器,第三臺(tái)運(yùn)行數(shù)據(jù)庫服務(wù)器。測試在1、5、10個(gè)用戶負(fù)載下運(yùn)行,通過對基準(zhǔn)響應(yīng)時(shí)間和總的事務(wù)率的測試結(jié)果,表明使用會(huì)話外觀模式的優(yōu)越性。
??? 在Grinder測試腳本中執(zhí)行的請求是隨著測試案例而變化的,但本質(zhì)上類似,因?yàn)槊總€(gè)請求都是調(diào)用調(diào)度器Servlet,分析基于響應(yīng)時(shí)間和總的事務(wù)率的結(jié)果[5,6,8,10]。下面是基于會(huì)話外觀測試模式的測試腳本摘錄:
??? grinder.jvm.talk=base
??? #start/stop from Grinder Cart
??? grinder.receiveCartSignals=true
??? grinder.grinderAddress=192.168.0.1
??? grinder.grinderport=789
??? ...
??? grinder.test1.parameter.url=http://sun2:5026/course/Dispatcher
??? grinder.test1.parameter.header.Content=application/x-www-form-urlencoded
??? grinder.test.description=find a course title with “6a”
??? grinder.test.paramter.post=find-6a.dat
??? ...
4.2 測試說明
??? 定義容器管理的實(shí)體Bean-CourseEJB,本文將對在CourseEJB前是否加入會(huì)話外觀模式,說明會(huì)話外觀模式的優(yōu)勢。因?yàn)閃eb組件對實(shí)體Bean進(jìn)行多次遠(yuǎn)程調(diào)用時(shí)開銷很大。會(huì)話外觀模式使用無狀態(tài)的會(huì)話Bean封裝了Web組件需要執(zhí)行的實(shí)體Bean-CourseEJB的業(yè)務(wù)邏輯[2,4]。與圖2所示的不使用會(huì)話外觀模式Facadeoff序列圖相比,圖3所示會(huì)話外觀模式使Web容器和EJB容器之間的耦合大大簡化了,多個(gè)精細(xì)的遠(yuǎn)程實(shí)體存取器的調(diào)用變?yōu)檩^粗的遠(yuǎn)程調(diào)用。即所有實(shí)體方法的調(diào)用都封裝在1個(gè)單一的會(huì)話Bean方法中:
?
?
??? public collection forCourseDescriptionLocal(String searchCourseID)
??? 該方法的實(shí)現(xiàn)等同于在FacadeOff中的實(shí)體Bean方法調(diào)用序列。
??? 可以把會(huì)話模式理解為在更大的粒度上實(shí)現(xiàn)的業(yè)務(wù)流程,在應(yīng)用中,底層的企業(yè)Bean雖可以實(shí)現(xiàn)多種功能模塊,但這些企業(yè)Bean的功能模塊單獨(dú)存在對于客戶是沒有意義的,客戶需要的是一次完整的“操作”過程,如果在這個(gè)工程中客戶對每一種方法都要依次調(diào)用,從網(wǎng)絡(luò)的負(fù)荷、系統(tǒng)安全性及事務(wù)的集中管理等角度上都是不合理的。因此可以將“操作”作為一個(gè)會(huì)話模式封裝具體的業(yè)務(wù)過程,客戶對象在需要業(yè)務(wù)功能時(shí)只需要調(diào)用一次遠(yuǎn)程接口,極大減少了在網(wǎng)絡(luò)邊界上的調(diào)用過程,同時(shí)實(shí)現(xiàn)了對安全權(quán)限和事務(wù)的集中管理。
4.3 測試結(jié)果比較
??? (1)響應(yīng)時(shí)間對比結(jié)果如圖4所示。
??? 對于1個(gè)用戶的負(fù)載,使用會(huì)話外觀模式中使響應(yīng)時(shí)間減少了38%,而10個(gè)用戶的負(fù)載使響應(yīng)時(shí)間減少了81%。
??? (2)總的事務(wù)率對比結(jié)果如圖5所示。
??? 這種影響是非常顯著的,對于1個(gè)用戶的吞吐量增加了158%,10個(gè)用戶的吞吐量增加了392%。
??? 本文通過對影響EJB性能因素的分析,給出了對EJB應(yīng)用程序調(diào)優(yōu)的策略和方法。并詳細(xì)說明了采用會(huì)話外觀模式的EJB設(shè)計(jì)模式后對系統(tǒng)性能的影響。會(huì)話外觀模式減少了在網(wǎng)絡(luò)邊界上的調(diào)用過程,同時(shí)實(shí)現(xiàn)了對安全權(quán)限和事務(wù)的集中管理,使Web容器和EJB容器之間的耦合大大簡化了。隨著應(yīng)用負(fù)載的增加,從系統(tǒng)響應(yīng)時(shí)間和總的事務(wù)率都凸現(xiàn)出會(huì)話外觀模式的優(yōu)勢,在更大的粒度上實(shí)現(xiàn)了業(yè)務(wù)流程。
參考文獻(xiàn)
[1] 孫宏濱.基于J2EE三層結(jié)構(gòu)分布系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].齊齊哈爾大學(xué)學(xué)報(bào),2002,18(4):61.
[2] 陳華軍.J2EE構(gòu)建企業(yè)級應(yīng)用解決方案[M].北京:人民郵電出版社,2002.
[3] 班書昊.EJB企業(yè)應(yīng)用與開發(fā)實(shí)例[M].北京:北京科海電子出版社,2003.
[4] 梁剛.面向企業(yè)信息系統(tǒng)的J2EE[J].黑龍江通信技術(shù),2002(1):38.
[5] CAVANESS Chuck, Special edition using enterprise java beans[D].SUN公司核心技術(shù)叢書 2002:22-27.
[6] 袁國勇.EJB組件開發(fā)模型及實(shí)現(xiàn)技術(shù)[J].應(yīng)用技術(shù),2002(12):22-23.
[7] 高奇微.分布式中間層EJB的研究與開發(fā)[J].中國農(nóng)業(yè)大學(xué)學(xué)報(bào),2001,6(4):88.
[8] 馬廷淮.用EJB開發(fā)J2EE應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2002,22(4):109-110.
[9] 彭宏慶.基于EJB的多層分布式系統(tǒng)模型的研究與應(yīng)用[J].航空計(jì)算技術(shù),2002,32(4):106.
[10] 高振東.基于J2EE系統(tǒng)的EJB技術(shù)研究與應(yīng)用[J].航空計(jì)算技術(shù),2003,33(1):71.
[11] 段江.使用EJB組件技術(shù)開發(fā)多層應(yīng)用[J].計(jì)算機(jī)輔助工程,2003(4):29-30.