為什么要使用EJB?(轉)
板橋里人 http://www.jdon.com 2004/03/08
首先,我們必須明確,為什么要使用J2EE?J2EE優點是什么?使用J2EE的主要原因是多層結構,傳統的兩層C/S結構難于維護,穩定性極差,界面代碼和數據庫代碼混淆在一起,牽一動百,多層結構使得界面和數據庫完全分離,并且誕生了中間件這樣的技術,如下圖:
Web+EJB能組成真正的多層結構
為什么使用EJB我原先認為這不是一個討論的話題,因為EJB是J2EE重要的組成部分,可以說沒有EJB的J2EE只是一種Web系統,這樣的系統非常容易喪失了多層結構的大部分優點(仔細想想那些混合多種層次功能JavaBeans和傳統兩層結構有什么區別?)。
當然,可以人為地在Javabeans之間進行層次劃分,例如Hibernate算數據持久層,某些JavaBeans是業務核心層,但是因為都是普通 JavaBeans,這種劃分沒有一種強制性和明顯標志性,這樣的系統更換了主創人員或設計師,可能就會被新的程序員修改得非?;靵y。
我們先看看一個包含EJB的J2EE系統是如何清晰地表達層次。如下圖:
Web完全只是一個MVC模式的實現,關鍵業務核心是在EJB的服務層實現,這樣做的優點是,Web只負責界面相關部分,因為,如果是一個智能客戶端,如Swing或J2ME,在不需要修改任何業務核心的情況下能夠方便地更換。同樣,提供Web Services功能,也只是在 Web層修改,不會涉及EJB方面的修改,同樣保證了系統的穩定性,保證了系統升級和未來的擴展性。
如果不使用EJB,在EJB服務層實現的業務核心將由普通JavaBeans實現,使用何種架構或設計能夠保證負責MVC的JavaBeans和負責業務核心的JavaBeans清晰地分開,又如何保證在新的程序員不會破壞和打亂你精心布局的JavaBeans架構?
EJB提供性能優化支持
最主要的是性能問題,由于以前國內中文Java網站有些人彎曲EJB,認為EJB性能低,其實這是一種非常膚淺錯誤的認識,我們首先看看在一般Java環境中是如何提高性能。
假定一個JavaBeans為A,那么一般使用這個JavaBeans命令如下:
A a = new A();
但是,在高訪問量的環境中,new A()其實是很費時消耗系統性能的,因此,能不能在軟件系統啟動時候就預先建立一些對象,這樣,系統運行時,從這些已經生成的對象池中借用一個,這樣,就 無需在使用時進行New,節約了開銷,提高了性能,因此,真正成熟性能解決方案都是需要對象池等支持。
在一個純Web結構的系統(也就是只能運行在Tomat環境中),例如Struts + Hibernate等這樣的系統,除非自己動手做,一般是沒有對象池技術支持的,因此他們的性能只能算是Demo演示版本的性能,根本無法承受大容量并發 訪問,也無法稱為一個成熟的系統,所以,我們研究成熟的開源Web系統,如Jive、OFBize,LifeRay等,他們都在Web層擁有自己的對象池 和緩存池。
對象池和緩存機制是J2EE必須的嗎?當然,是所有成熟系統必須的,Windows系統如果去掉緩存將會變得怎樣?
自己動手開發對象池和緩存機制并不是一件簡單的事情,需要對多線程以及同步鎖等底層原理有深層次的把握,這其實也是一門非常深入的Java研究分支,所以,你可以拋開你的客戶焦急的催促,精心研究開發自己的對象池和緩存池。
但是,EJB容器(如JBoss)已經提供了對象池和緩存機制,所以,沒有事務機制的無狀態Session Bean的性能肯定要強于普通JavaBeans。EJB容器不但在單機中提供了對象池和緩存,而且可以跨服務器實現動態負載平衡,這些都無需開發者自己 開發任何軟件代碼,結構如下:
EJB組件能提供真正的可重用框架
每一個jar包代表一個EJB組件,一個系統可以由多個可重用的EJB組件構成,例如:樹形結構EJB組件;自增序號EJB組件;用戶資料EJB組件等,這樣的EJB組件可以象積木一樣搭配在大部分應用系統中,提高了系統的開發效率,保證了開發質量。
下圖是某個新的具體系統時應用到的EJB組件圖,在這個新的應用中,由于使用了以前大量可重用的EJB組件,新的開發工作基本集中在界面設計和流程安排上:
EJB提供了事務機制
事務機制對于一些關鍵事務是很重要的,例如ATM機提款,提款有多個動作:修改數據庫以及數錢等,如果這其中有任何一個環節出錯,那么其它已經實現的操作必須還原,否則,就會出現,提款人沒有拿到錢,但是卡上已經扣款等不可思議的事情發生。
EJB提供的事務機制非常周全,但事務機制帶來的缺點是性能的降低,因此,有些人認為EJB很重,因為在實際應用中,有的用戶系統可能不需要事務機制, 只是需要EJB提供的性能優化機制,這樣,如果使用EJB,就象叫一個人來背東西,他除了背著我要的東西外,還背著我不要的東西。
除非你是一個完美主義,在一般企業應用或數據庫系統應用中,EJB不會對你構成很重的包袱。
CMP獨特的優點
開源以及一些數據庫持久層技術崇拜者,一直抨擊CMP,認為CMP慢無用,實際最大的問題是他們的設計和使用問題。
由于EJB容器(如JBoss)對CMP實現有事務機制的緩存優化,因此,CMP特別適合多個用戶同時更新同一個數據源的情況,CMP這種嚴格的事務完 整性保證多個用戶同時操作一個數據記錄時,能夠保證性能優化和數據的完整性,如果這個數據記錄是是軟件系統的狀態標志,它的狀態會影響系統中很多的環節, 那么狀態更改的重要性不言而喻。
如果沒有事務完整性支持,你的軟件系統在用戶訪問量變大,就會變得發生各種不可能發生的邏輯錯誤,查看程序邏輯是正確的,那么問題出在哪里?出在數據完整性上。
由于每個CMP在內存中都有一個緩存,在實際應用中,如果使用CMP批量讀數據庫數據,幾萬條查詢完畢,內存中充滿了幾萬條CMP緩存,如果這時你的 EJB容器設置不當(如使用JBoss缺省配置),那么JVM的垃圾回收機制就會頻繁啟動,導致你的系統變慢甚至死機,這也是一些人抨擊CMP慢的原因所 在,其實他們使用方法不當,或者沒有正確配置EJB容器CMP緩存。
對于這種情況,根據J2EE核心模式,推薦使用DAO+JDBC方式。
小結
除非你對設計模式非常精深,能夠將自己系統中的JavaBeans使用模式或某種框架進行固定分層,同時,你孜孜不倦研發出對象池,又熟練于JTA等事 務機制,你可以選擇沒有EJB的純Web結構,就象Jive、OFBiz那樣。當然還有一個前提,老板不懂或者非常有挑戰性(做與IBM SUN 微軟齊名的公司和技術)。
不要再被TSS那些狂熱的開源先生誤導,他們有時間有保障可以做他們喜歡的事情,作為專業的J2EE程序員,按照J2EE標準去學習去行動,也不要認為,只要使用了J2EE其中某個技術如Jsp或JavaBeans就心安理得認為自己的系統是J2EE了。
當然,我并不是說純Web系統不能實現多層結構,但是至少在很多方面沒有Web+EJB結構完善和清晰,所以,EJB不是J2EE可以忽視的部分,而是主要的重要的部分,重要業務功能核心都封裝在EJB中,相反Web層是一種次要的、和界面相關的層次。
補充:什么情況下不需要EJB,在SUN的SECA架構師試卷中回答:小型系統和不需要事務。另外過去那種認為“EJB有性能問題”根本是一種繆誤,具體可參考下面有關問題。
?posted on 2006-08-02 15:56 liaojiyong 閱讀(354) 評論(0) 編輯 收藏 所屬分類: EJB