開發(fā)J2EE應(yīng)用的要領(lǐng)

字號:

J2EE,作為開發(fā)mission-critical的企業(yè)級應(yīng)用的一整套規(guī)范的整合平臺。其規(guī)范之多、內(nèi)容之廣,從而給開發(fā)J2EE應(yīng)用帶來了很多“麻煩”。比如,為實(shí)現(xiàn)內(nèi)容的RDBMS存儲,我們可能的方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等方法(其中一些方法不是J2EE規(guī)范所包含的)。因此,為實(shí)現(xiàn)J2EE各層(至少有表示層、控制層、商業(yè)邏輯層等3層)以及層與層之間的耦合,J2EE系統(tǒng)架構(gòu)師需要考慮的問題會很多。加上,J2EE本身的快速發(fā)展,給架構(gòu)、開發(fā)具有工業(yè)強(qiáng)度的J2EE應(yīng)用帶來一些難題。
    同時(shí),軟件開發(fā)技術(shù)從來就沒有“銀彈”,所以J2EE技術(shù)也不是萬能的。但是,如果我們在結(jié)合具體商業(yè)需求的基礎(chǔ)上,合理的應(yīng)用好J2EE技術(shù),其結(jié)果可想而知。本文試探從自己以往的項(xiàng)目經(jīng)驗(yàn)來探討開發(fā)J2EE應(yīng)用應(yīng)該遵循的幾點(diǎn)準(zhǔn)測入手,以起到拋磚引玉的作用。如果能達(dá)到這一點(diǎn)要求,則萬分激動。
    本文結(jié)合JBoss 3.2.1下的J2EE應(yīng)用開發(fā)為例展開論述。
    1,結(jié)合商業(yè)需求選擇合理的架構(gòu)
    如果脫離商業(yè)需求,而單獨(dú)的討論技術(shù)本身的優(yōu)勢是不夠的。各項(xiàng)技術(shù)都有產(chǎn)生的特定背景,其中很多都是來自工業(yè)需求而觸動的。一般而言,企業(yè)信息系統(tǒng)(EIS)都要求自己穩(wěn)定、安全、可靠、高效、便于維護(hù)。同時(shí),各個(gè)企業(yè)信息系統(tǒng)都有自己獨(dú)特的要求,可能有些時(shí)候需要考慮與原有遺留系統(tǒng)的集成,所以了解各個(gè)企業(yè)信息系統(tǒng)具體的商業(yè)需求對于整個(gè)系統(tǒng)的架構(gòu)顯得很關(guān)鍵。
    比如,如果待開發(fā)的J2EE應(yīng)用系統(tǒng)中使用到的數(shù)據(jù)大部分來自于外在數(shù)據(jù)源;而這些數(shù)據(jù)可能是通過JDBC直接從外在數(shù)據(jù)源導(dǎo)入到待開發(fā)的J2EE系統(tǒng)的Database中。對于這種情形,如果在開發(fā)過程中,僅僅使用JDBC來操作數(shù)據(jù)庫,對于小強(qiáng)度(并發(fā)訪問用戶少、數(shù)據(jù)流量少)的情形,顯然是比較合適的;但如果,并發(fā)訪問用戶較多、數(shù)據(jù)流量大,對Database層使用較為頻繁的情形,則顯得有些力不從心。因此,對于這種需求,我們可以考慮采用Entity Beans with Caches。打個(gè)比方,在JBoss 3.2.1中對于Entity Beans的Cache策略有多種,這時(shí)可以考慮使用,,即“Standard CMP 2.x EntityBean”,方式并采用“D”類型的commit-option來保證Entity Beans的內(nèi)容與數(shù)據(jù)源的同步,并使得系統(tǒng)的性能得到大大改善(同直接使用JDBC相比)。其中,可以將一些Entity Beans設(shè)置為read-only,以改善性能。
    當(dāng)然,在這里也可以采用其他一些O/R Mapping技術(shù),比如TopLink。
    再比如,考慮這樣一種情形:如果待開發(fā)的企業(yè)信息系統(tǒng)使用到的數(shù)據(jù)都是由系統(tǒng)本身生成和操作的,則建議采用:CMP Entity Beans技術(shù)。Entity Beans給大家的印象很壞,這可能與EJB 1.1給大家留下的壞映象有關(guān)吧。但是,EJB 2.0(或者說2.1)得到了很大的改善,Local Interfaces、CMR、Read-Only、Session Façade模式給Entity Beans注入了活力。當(dāng)然,并發(fā)用戶多、數(shù)據(jù)流量很大時(shí)才會體現(xiàn)出使用Entity Beans的優(yōu)勢。其中,有一點(diǎn)很關(guān)鍵:要注重Entity Beans技術(shù)的性能調(diào)優(yōu),各個(gè)應(yīng)用服務(wù)器都有自己的一套性能調(diào)優(yōu)方案。對于JBoss 3.2.1,配置文件standardjboss.xml提供了Entity Beans技術(shù)調(diào)優(yōu)的入口。比如,Bean Lock策略的合理使用對于Entity Beans的調(diào)優(yōu) 就顯得很重要。這樣使得,我們可以更加關(guān)注于系統(tǒng)的商業(yè)邏輯,而不只是底層的Database(EJB調(diào)優(yōu)處于EJB Container中,因此我們處在  J2EE性能的高端,而不是底端,即Database層。同時(shí),Database層的調(diào)優(yōu)使得J2EE系統(tǒng)的數(shù)據(jù)庫移植性大打折扣。)。
    簡而言之,要結(jié)合各個(gè)系統(tǒng)的特定需求和狀況給出具體的技術(shù)架構(gòu)方案,而不能孤單的論述技術(shù)本身的好壞。
    2,F(xiàn)ramework的合理選用
    設(shè)計(jì)模式在J2EE應(yīng)用系統(tǒng)中扮演著重要的角色。因此,有一個(gè)問題擺在大家面前,是自己來實(shí)現(xiàn)具體的設(shè)計(jì)模式,還是借助于Third-party Framework。如果貴公司不大,或者說公司不想在J2EE基礎(chǔ)應(yīng)用Framework投入很多精力,選用現(xiàn)有的較為成熟的、穩(wěn)定、與現(xiàn)有J2EE Specification兼容的技術(shù)框架會比較明智。
    一般而言,F(xiàn)ramework本身,或者說J2EE平臺本身都是實(shí)現(xiàn)并優(yōu)化了具體的設(shè)計(jì)模式、規(guī)則,比如業(yè)務(wù)代理、Service Locator(包括Web Tier和EJB Tier各自的服務(wù)定位器,起到統(tǒng)一管理有限資源、Cache相關(guān)資源的作用,便于系統(tǒng)移植)、Front Controller、DAO等等。現(xiàn)有的J2EE Framework比較豐富。比如:
    Struts: 對于實(shí)現(xiàn)了Model 2類型的Framework,對于現(xiàn)在以及將來(隨著JSF規(guī)范、技術(shù)的成熟),選用她是一種明智之舉。目前,Struts已經(jīng)發(fā)展到1.1版本。其內(nèi)在的MVC主線、對后端數(shù)據(jù)操作方式?jīng)]有限定、集合了Apache Jakarta項(xiàng)目組的優(yōu)秀相關(guān)項(xiàng)目的精華,可謂是開發(fā)J2EE應(yīng)用的佳品。同時(shí),對于具有.NET Web Forms功能的下一代J2EE平臺技術(shù)JSF而言,Struts本身可考慮到與JSF的兼容和集成性。比如,通過JSP呈現(xiàn)表示層、Servlet呈現(xiàn)控制層、EJB呈現(xiàn)數(shù)據(jù)存儲層。各層之間,可以通過值對象、HTTP相關(guān)對象來通訊,實(shí)現(xiàn)J2EE相關(guān)技術(shù)的完美應(yīng)用。