- 相關(guān)推薦
J2EE應用的十個(gè)技巧
J2EE核心是一組技術(shù)規范與指南,其中所包含的各類(lèi)組件、服務(wù)架構及技術(shù)層次,均有共同的標準及規格,讓各種依循J2EE架構的不同平臺之間,存在良好的兼容性,解決過(guò)去企業(yè)后端使用的信息產(chǎn)品彼此之間無(wú)法兼容,企業(yè)內部或外部難以互通的窘境。那么關(guān)于j2ee的應用有哪些技巧呢?下面yjbys小編為大家一一揭曉!
構建高性能的J2EE應用不但需要了解常用的實(shí)施技巧。下面介紹最常用的10種有效方法,可幫助架構設計師們快速成為這方面的專(zhuān)家。
Java性能的基礎—內存管理
任何Java應用,單機的或J2EE的性能基礎都可歸結到你的應用是如何管理內存的問(wèn)題。Java的內存管理包括兩個(gè)重要任務(wù):內存的分配和內存的 回收。在內存的分配中,目標是要減少需要創(chuàng )建的對象。
內存回收是導致性能下降的普遍原因。也就是說(shuō),內存中的對象越多,垃圾回收越困難。所以我們對創(chuàng )建對象的態(tài)度應該越保守越好。
在J2EE應用中常見(jiàn)的兩個(gè)內存有關(guān)的問(wèn)題是:游離的對象(也被稱(chēng)為內存泄露)和對象循環(huán)(指大量頻繁創(chuàng )建和刪除-在Java中體現為解除引用—對 象)。
我們應注意確保所有可到達的對象實(shí)際是活的,即這些對象不但在內存中,而且也要在執行的代碼中是存在的。當對象在應用中已經(jīng)沒(méi)有用了,而我們卻忘記 了刪除對該對象的引用時(shí),游離的對象就出現了。
我們知道垃圾回收會(huì )占用CPU時(shí)間。短期對象的大量創(chuàng )建增加了垃圾回收的頻率會(huì )造成性能下降。
不要在Servlet中實(shí)現業(yè)務(wù)邏輯
在構建J2EE應用時(shí),架構工程師通常會(huì )使用到J2EE的基本部分——Servlet。如果架構師不使用Session Beans, Entity Beans, 或 Message Beans, 那么改進(jìn)性能的方法就很少。只能采用增加CPU或更多的物理服務(wù)器等方法。EJB使用了緩存(cache)和資源池等方法可以提高性能和擴展性。
盡可能使用本地接口訪(fǎng)問(wèn)EJB
在早期的J2EE (遵循EJB1.X規范)應用中,訪(fǎng)問(wèn)EJB是`通過(guò)RMI使用遠程接口實(shí)現的。隨著(zhù)EJB2.0的出現,可以通過(guò)本地接口訪(fǎng)問(wèn)EJB,不再使用RMI, 在同一個(gè)JVM中使用遠程方法已經(jīng)少多了。但是現在還是有一些使用EJB1.X實(shí)現的應用和不知道使用本地接口的一些EJB新手。為說(shuō)明這點(diǎn),我們作個(gè)比 較:
1、客戶(hù)端應用調用本地Stub
2、該Stub裝配參數
3、該Stub傳到skeleton
4、該skeleton分解參數
5、該skeleton調用EJB對象
6、EJB對象執行容器服務(wù)
7、EJB對象調用企業(yè)BEAN實(shí)例
8、企業(yè)BEA執行操作
9、執行組裝/分解步驟然后返回
與遠程接口處理相比較,本地接口的EJB方法是:
1、客戶(hù)端調用本地對象
2、本地對象執行容器服務(wù)
3、本地對象調用企業(yè)Bean實(shí)例
4、企業(yè)Bean實(shí)例執行操作
5、沒(méi)有其他返回步驟!
如果你不需要從遠程的客戶(hù)端訪(fǎng)問(wèn)一個(gè)特殊EJB,就應該使用本地方法。
在實(shí)現Session Bean的服務(wù)中封裝對實(shí)體EJB的訪(fǎng)問(wèn)
從Servlet訪(fǎng)問(wèn)實(shí)體EJB不但效率低而且難于維護。使用Session Facade(會(huì )話(huà)外觀(guān))模式可把對實(shí)體EJB的訪(fǎng)問(wèn)封裝在會(huì )話(huà)EJB中,在該會(huì )話(huà)EJB中通過(guò)使用本地接口訪(fǎng)問(wèn)實(shí)體EJB而避免過(guò)多的遠程調用。
這項技術(shù)會(huì )有額外的性能和擴展方面的好處,這是因為會(huì )話(huà)和實(shí)體EJB可以使用緩存和資源池技術(shù)來(lái)進(jìn)行改進(jìn)。另外,由于負載的需要,會(huì )話(huà)和實(shí)體EJB 可被擴展部署到其他硬件設備上,這比將Servlet層復制擴展到其他硬件設備上要簡(jiǎn)單的多。
盡量粗粒度訪(fǎng)問(wèn)遠程EJB
當訪(fǎng)問(wèn)遠程EJB時(shí),調用set/get方法將產(chǎn)生過(guò)多的網(wǎng)絡(luò )請求,同時(shí)也導致遠程接口處理的過(guò)載。為避免這種情況,可考慮將數據屬性集中在一個(gè)對 象中,這樣通過(guò)一次對遠程EJB的調用就可以傳遞所有數據。這項技術(shù)就是數據傳輸對象(Data Transfer Object)模式。
優(yōu)化SQL
J2EE 的架構設計工程師和開(kāi)發(fā)人員通常不是SQL專(zhuān)家或經(jīng)驗豐富的數據庫管理員。首先應該確保SQL使用了數據庫提供的索引支持。在某些情況下,將數據庫的索引 和數據分開(kāi)存放會(huì )提高性能。但要知道,增加額外的索引可以提高SELECT性能但也會(huì )降低INSERT的性能。對于某些數據庫,關(guān)聯(lián)表之間的排序會(huì )嚴重影 響性能?梢远嘞驍祿䦷旃芾韱T咨詢(xún)。
避免在實(shí)體EJB中過(guò)多執行SQL
有時(shí)候,通過(guò)實(shí)體EJB訪(fǎng)問(wèn)數據會(huì )執行多個(gè)SQL語(yǔ)句。根據J2EE 規范,第一步,將調用實(shí)體Bean的find(發(fā)現)方法;第二步,在第一次調用實(shí)體EJB的業(yè)務(wù)方法時(shí),容器會(huì )調用ejbLoad()從數據庫中獲得信 息。
很多CMP(容器管理持久性)在調用發(fā)現方法時(shí)就緩存了實(shí)體數據,所以在調用ejbLoad()時(shí)就不再訪(fǎng)問(wèn)數據庫了。應該避免使用 BMP(Bean管理的持久性)或者自己實(shí)現緩存算法避免二次訪(fǎng)問(wèn)數據庫。
使用Fast Lane Reader 模式訪(fǎng)問(wèn)只讀數據
J2EE 應用經(jīng)常要以只讀方式訪(fǎng)問(wèn)大量長(cháng)時(shí)間不變的數據,而不是訪(fǎng)問(wèn)單個(gè)實(shí)體,例如瀏覽在線(xiàn)產(chǎn)品目錄。在這種只讀情況下,使用實(shí)體EJB訪(fǎng)問(wèn)數據會(huì )導致嚴重過(guò)載并 且實(shí)現很麻煩。實(shí)體EJB 適合于對單個(gè)實(shí)體的粗粒度訪(fǎng)問(wèn),訪(fǎng)問(wèn)大量的列表只讀數據時(shí)效率不高。不管是使用CMP還是BMP,一定需要編寫(xiě)代碼操作多個(gè)實(shí)體EJB及其關(guān)聯(lián)。這將導致 訪(fǎng)問(wèn)多個(gè)數據庫并存在大量的也是不必要的事務(wù)開(kāi)銷(xiāo)。
利用Java Messaging Servce(消息服務(wù))
J2EE規范在JMS中提供了內置的異步處理服務(wù)。當涉及到系統需求時(shí),應該了解在什么情況下應該采用JMS進(jìn)行異步處理的設計。一旦確定要執行一 些異步處理,那么同步處理的任務(wù)就應該越少越好,將數據庫密集的操作安排在稍后的異步處理中完成。
緩存JNDI Lookup查找
很多操作在進(jìn)行JNDI查找時(shí)要消耗大量資源。通常應該緩存JNDI資源避免網(wǎng)絡(luò )調用和某些處理的過(guò)載?梢跃彺娴腏NDI查找包括:
EJB Home Interfaces
Data Sources
JMS Connection Factories
MS Destinations/Topics
一些JNDI包實(shí)現了緩存功能。但是調用對EJB主接口的narrow方法時(shí),這種功能作用有限。緩存查找的設計應該使用共享的 IntialContext 實(shí)例,盡管構建它很麻煩。這是因為需要訪(fǎng)問(wèn)多種數據源,包括應用資源文件JNDI.properties,系統屬性的各項參數,傳入到構造函數的各項參數。
【J2EE應用的十個(gè)技巧】相關(guān)文章:
高性能J2EE應用的技巧03-22
構建高性能J2EE應用的技巧03-20
J2EE學(xué)習技巧03-20
十個(gè)實(shí)用的演講技巧03-20
J2EE應用服務(wù)器03-29
成為高爾夫高手的十個(gè)技巧03-04
快速提高的十個(gè)攝影技巧02-28