kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

          http://dev2dev.bea.com.cn/techdoc/webser/200406201.html
          開發(fā)實(shí)體EJB 增強(qiáng)的性能和開發(fā)
          摘要
          Enterprise JavaBean (EJB)
          是一些應(yīng)用程序組件,它們實(shí)現(xiàn)了 EJB 體系結(jié)構(gòu)規(guī)范,并且是 Java 2 Enterprise Edition (J2EE) 平臺的一部分。EJB 是開發(fā)和部署分布式的、可伸縮的、事務(wù)型的、安全的、可移植的、基于組件的商業(yè)應(yīng)用的理想選擇。

          Enterprise JavaBean (EJB)一些應(yīng)用程序組件,它們實(shí)現(xiàn)了EJB體系結(jié)構(gòu)規(guī)范,并且是Java 2 Enterprise Edition (J2EE) 平臺的一部分。EJB是開發(fā)和部署分布式的、可伸縮的、事務(wù)型的、安全的、可移植的、基于組件的商業(yè)應(yīng)用的理想選擇。

          基于EJB的商業(yè)應(yīng)用需要一個EJB容器,用于運(yùn)行時的執(zhí)行。所有遵從J2EE規(guī)范的應(yīng)用服務(wù)器,包括WebLogic 8.1在內(nèi),都提供了EJB容器。

          EJB體系結(jié)構(gòu)背后的主要動機(jī)是關(guān)系的分離:它將與應(yīng)用程序基礎(chǔ)設(shè)施相關(guān)的部分(例如事務(wù)處理和安全性)與核心應(yīng)用程序部分(例如業(yè)務(wù)邏輯)分離開來。簡言之,EJB體系結(jié)構(gòu)通過指定EJB容器與EJB開發(fā)者之間職責(zé)的區(qū)別,從而達(dá)到這種關(guān)系上的分離。例如,透明地實(shí)現(xiàn)事務(wù)處理是EJB容器的職責(zé),而實(shí)現(xiàn)業(yè)務(wù)邏輯則應(yīng)由EJB開發(fā)者負(fù)責(zé)。雖然EJB容器執(zhí)行任務(wù)時可能需要某些線索(hint),但是,比起實(shí)際地實(shí)現(xiàn)這些與基礎(chǔ)設(shè)施相關(guān)的活動來,提供這類線索(通過基于XML的部署描述符)的代價是非常少的。總之,這種關(guān)系分離的策略使得商業(yè)應(yīng)用的開發(fā)比其他方式要高效得多。

          EJB體系結(jié)構(gòu)規(guī)范有4種版本:1.01.12.02.1。事實(shí)上,EJB version 1.0已經(jīng)過時了,而最新版本,即2.1,由于剛剛才出現(xiàn),所以還沒有廣泛提供。BEA WebLogic Server 8.1同時支持1.12.0這兩種版本。我們強(qiáng)烈建議在WebLogic Server 8.1中進(jìn)行開發(fā)時使用EJB version 2.0

          實(shí)體bean是一種EJB。除了EJB背后的一般動機(jī)外,使用實(shí)體bean的特定動機(jī)是為持久存儲中的業(yè)務(wù)域(business-domain)實(shí)體提供一種駐留在內(nèi)存中的、可共享的、面向?qū)ο蟮囊晥D。通常,業(yè)務(wù)域?qū)ο缶褪顷P(guān)系數(shù)據(jù)庫中一個表里面的一行。在本文中,我們討論了關(guān)于在WebLogic Server 8.1環(huán)境下Entity EJB的設(shè)計、開發(fā)和部署的特定問題。至于關(guān)于EJB技術(shù)的綜合教程,我們推薦http://java.sun.com/j2ee上的J2EE教程。

          概述
          實(shí)體bean是設(shè)計用來管理關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)的。在BEA WebLogic Server 8.1環(huán)境下,Entity EJB的開發(fā)包括EJB的設(shè)計、生成、打包和部署。

          從設(shè)計的角度來看,實(shí)體bean可以由兩條正交軸線來分類:持久性和訪問。順著持久性這條軸線,有兩種類型的實(shí)體beanBean管理的持久性(Bean-managed persistenceBMP)和容器管理的持久性(Container-managed persistenceCMP)。如果是CMP,則EJB容器將管理實(shí)體bean的持久性。而對于BMP,則由實(shí)體bean的開發(fā)者通過指定的Java代碼來管理實(shí)體bean的持久性。CMPBMP之間的選擇是互斥的。順著訪問這條軸線,又有兩種類型的bean:遠(yuǎn)程的和本地的。遠(yuǎn)程實(shí)體bean提供了定位的透明性,并且可以從不同的Java虛擬機(jī)上訪問。相反,本地實(shí)體bean只能在同一應(yīng)用服務(wù)器內(nèi)訪問。本地和遠(yuǎn)程之間的選擇不是互斥的,因此可以設(shè)計具有雙重接口的bean

          EJB體系結(jié)構(gòu)規(guī)范中,每個實(shí)體EJB組件都是由一組指定的Java類和一組指定的XML部署描述符組成。EJB的打包過程包括將所有指定的EJB Java類文件和XML部署描述符文件打包到一個Java Archive (JAR)文件中。如果實(shí)體EJB還要依賴于一些Java助手類文件,那么也可以將這樣的類文件包括到EJB JAR文件中,或者將它們單獨(dú)打包到一個不同的JAR文件中。

          EJB的部署可分為兩種方式,要么是在BEA WebLogic Server 8.1內(nèi)直接部署EJB JAR文件以及所依賴的任何JAR文件,要么是首先將EJB jar文件和所有依賴的JAR文件打包到一個企業(yè)應(yīng)用歸檔(enterprise application archiveEAR)文件內(nèi),然后再在WebLogic Server 8.1內(nèi)部署這個EAR文件。

          設(shè)計EJB
          在設(shè)計一個實(shí)體時,需要考慮的幾個重要選擇是:

          1. 是設(shè)計一個CMP實(shí)體bean還是一個BMP實(shí)體bean
          2. 是設(shè)計一個本地實(shí)體bean,還是設(shè)計一個遠(yuǎn)程實(shí)體bean,抑或是設(shè)計一個雙重接口的實(shí)體bean
          3. 是設(shè)計一個粗粒度(coarse-grained)的實(shí)體bean,還是一個細(xì)粒度(fine-grained)的實(shí)體bean
          4. 是使用數(shù)據(jù)傳輸對象,還是使用getset方法來訪問實(shí)體EJB中的數(shù)據(jù)。

          下面將討論在開發(fā)實(shí)體EJB時要面臨的這些設(shè)計選擇。

          CMPBMP
          記住,雖然可能存在一些很合理的例外,但是一般情況下我們強(qiáng)烈推薦使用CMP這種設(shè)計。至于為什么要選擇CMP,而不是BMP,這里有三大主要原因。

          1. BMP相比,CMP提供了跨多種不同數(shù)據(jù)庫的可移植性,因?yàn)?/SPAN>CMP實(shí)體bean不包含任何特定于數(shù)據(jù)庫的持久性代碼。CMP易于設(shè)計、實(shí)現(xiàn)和維護(hù)。
          2. 通常,CMP擁有好于BMP的性能,因?yàn)?/SPAN>EJB容器將自動生成特定于數(shù)據(jù)庫的代碼,并且這些代碼將為目標(biāo)數(shù)據(jù)庫而優(yōu)化。
          3. CMP通過使用本地接口,使得在相關(guān)EJB的網(wǎng)絡(luò)中程序性地(programmatically)進(jìn)行導(dǎo)航變得非常容易。

          本地接口、遠(yuǎn)程接口和雙重接口
          因?yàn)?/SPAN>CMP通過本地接口管理著實(shí)體EJB之間的關(guān)系,所以我們強(qiáng)烈建議總是提供一個本地接口。我們認(rèn)為遠(yuǎn)程接口需要的時候很少,但是如果仔細(xì)評估一下就會證明遠(yuǎn)程接口也是需要的。所以,我們還是設(shè)計一個雙重接口吧。

          本地接口通過本地客戶機(jī)提供了對EJB的優(yōu)化的訪問;遠(yuǎn)程方法調(diào)用(remote method invocationRMI)的語義不要求通過本地客戶機(jī)、使用本地接口來訪問EJB

          遠(yuǎn)程客戶機(jī)與EJB容器位于不同的虛擬機(jī)上,它需要RMI和遠(yuǎn)程接口來訪問EJB。從理論上講,單單設(shè)計一個本地實(shí)體存在著一個明顯的缺點(diǎn),那就是只有在相同應(yīng)用服務(wù)器內(nèi)的客戶機(jī)才能訪問該實(shí)體bean。然而,這只是一個理論上的缺點(diǎn),因?yàn)閷?shí)際上很少需要從應(yīng)用服務(wù)器之外訪問實(shí)體EJB

          粗粒度與細(xì)粒度
          這是一個非常有爭議的專題,所以還應(yīng)根據(jù)您個人的經(jīng)驗(yàn)小心地評價關(guān)于此專題的一些不同觀點(diǎn)。我們的選擇是,實(shí)體EJB最常用于表示應(yīng)用程序業(yè)務(wù)域中各個實(shí)體,所以應(yīng)該讓實(shí)體EJB盡量地細(xì)粒度,不過也應(yīng)將設(shè)計限定為僅提供一個本地接口。關(guān)于這個問題的爭論始于EJB體系結(jié)構(gòu)規(guī)范1.x版本,當(dāng)時只能通過一個遠(yuǎn)程接口來訪問實(shí)體EJB。建立在EJB 1.x版本基礎(chǔ)上的任何反對使用細(xì)粒度實(shí)體EJB的觀點(diǎn),雖然當(dāng)時也有合理之處,但是在EJB體系結(jié)構(gòu)規(guī)范2.0  中卻已不合時宜了,并且最終遭到反對。請謹(jǐn)記:有些專家可能不同意我們的觀點(diǎn),所以我們鼓勵您通過實(shí)驗(yàn)進(jìn)行考證,并在此專題上形成自己的觀點(diǎn)。

          數(shù)據(jù)傳輸對象與GetSet方法
          這又是一個有爭議的專題。我們的觀點(diǎn)如下所述:

          • 在實(shí)體EJB的本地接口中暴露CMP持久字段的所有get訪問器(accessor)方法。
          • 為不屬于實(shí)體EJB主鍵的一部分的每個CMP持久字段創(chuàng)建包裝器(wrapperset方法,并且在實(shí)體EJB的本地接口中暴露這些包裝器方法。使用這些包裝器方法背后的動機(jī)是,CMP要求所有持久字段都具有抽象方法setXXX,如果需要在這些setXXX方法內(nèi)進(jìn)行任何驗(yàn)證,那么就可以先在包裝器方法內(nèi)完成驗(yàn)證,然后再調(diào)用相應(yīng)的setXXX方法。如果不需要這樣的驗(yàn)證,那么省掉包裝器方法而直接包括setXXX方法也無不可。
          • 在某些少見的環(huán)境下,可能要求實(shí)體EJB有一個遠(yuǎn)程接口,這時可以為每個實(shí)體EJB定義一個數(shù)據(jù)傳輸對象,將該數(shù)據(jù)傳輸對象作為實(shí)體EJB的遠(yuǎn)程接口中的一個參數(shù),暴露其getset方法。

          生成和打包EJB
          EJB體系結(jié)構(gòu)規(guī)范中,每個實(shí)體EJB組件都由一組指定的Java類和一組指定的XML部署描述符組成:

          1. 一個必需的實(shí)現(xiàn)實(shí)體bean核心功能的bean類。
          2. 一個遠(yuǎn)程接口、本地接口或雙重接口,該接口為實(shí)體bean提供了適當(dāng)?shù)目蛻魴C(jī)視圖。
          3. 一個遠(yuǎn)程主接口(home interface)、本地主接口或者雙重主接口,該接口為實(shí)體bean的生命周期管理提供了適當(dāng)?shù)慕涌凇?/SPAN>
          4. 如果是具有組合主鍵的實(shí)體bean,那么還有一個必需的主鍵類。
          5. 一個ejb-jar XML部署描述符文件,EJB體系結(jié)構(gòu)規(guī)范version 2.0對此作了規(guī)定。
          6. 一個特定于供應(yīng)商的 weblogic-ejb-jar XML部署描述符文件,BEA WebLogic Server 8.1 對此有規(guī)定。
          7. 如果是CMP實(shí)體bean,那么還應(yīng)有一個特定于供應(yīng)商的weblogic-cmp-rdbms-jar XML 部署描述符文件,BEA WebLogic Server 8.1對此有規(guī)定。

          這里使用的例子實(shí)體EJB是一個CMP實(shí)體EJB,它有一個遠(yuǎn)程接口,它的名稱是AccountEJB。在隨WebLogic Server 8.1一起安裝的示例文件中,即 /weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄下,可以找到這個實(shí)體EJB

          實(shí)體bean EJB類和接口可以用EJBGen工具來生成。

          EJBGen
          EJBGen
          是一種EJB 2.0代碼生成器,它能夠從一個EJB bean類生成本地接口/遠(yuǎn)程接口、本地主接口/遠(yuǎn)程主接口、主鍵類和部署描述符。在EJB bean類中使用EJBGen標(biāo)記來指定不同的EJB設(shè)計配置(例如,本地/遠(yuǎn)程和CMP/BMP)。在WebLogic Server 8.1 SP01 中,EJBGen 類被包括在/weblogic81/server/lib/weblogic.jar中。在WebLogic Server 8.1 SP02 & SP03中,EJBGen類被包括在/weblogic81/server/lib/ejbgen.jar文件中。將ejbgen.jar添加到Classpath中,以便使用EJBGen工具。

          EJBGen通過以下命令來調(diào)用:

          javadoc -docletpath ejbgen.jar -doclet weblogic.tools.ejbgen.EJBGen
          <EjbBeanClass>.java

          該命令有一些選項(xiàng):

          • -d [directory]: 創(chuàng)建EJB/接口和部署描述符時所在的目錄。
          • -descriptorDir [directory]: 創(chuàng)建部署描述符時所在的目錄。
          • -wls7: 有了–wls7這個選項(xiàng),就會生成WebLogic Serve 7.1部署描述符。

          如果要將更早版本的BEA WebLogic Server部署描述符轉(zhuǎn)換成WebLogic Server 8.1部署描述符,那么可以使用DDConverter

          DDConverter
          DDConverter
          是一個命令行工具,用于將更早版本的XML部署描述符(ejb-jar.xmlweblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml)轉(zhuǎn)換成當(dāng)前版本的WebLogic Server DDConverter可以用以下命令來調(diào)用:

          java weblogic.ejb20.utils.DDConverter [options] –d destDir file1 [file2...]

          在這個命令中,file是指包含EJB 1.1部署描述符的一個EJB 1.0部署描述符文件或JAR文件。DDConverter的一部分選項(xiàng)有:

          • -d destDir:部署描述符輸出到的目錄。
          • -EJBVer output EJB version: 指定輸出EJB版本。缺省版本是2.0

          在部署EJB之前,必須將其打包到一個JAR文件或EAR文件中。

          EJB JAR文件
          EJB JAR
          文件的結(jié)構(gòu)由EJB類和接口以及包含部署描述符的 META-INF目錄組成。創(chuàng)建一個目錄source/ejb20/basic/containerManaged和一個目錄source/ejb20/basic/containerManaged/META-INF。將Account.javaAccountBean.javaAccountHome.java ProcessingErrorException.java/weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄復(fù)制到source/ejb20/basic/containerManaged目錄。將ejb-jar.xmlweblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml/weblogic81/samples/server/examples/src/examples/ejb20/basic/containerManaged目錄復(fù)制到source/ejb20/basic/containerManaged/META-INT目錄。

          通過Apache Ant使用編譯好的EJB Java類文件和部署描述符創(chuàng)建一個JAR文件,Apache Ant  是一種基于Java的聯(lián)編(build)工具。Apache Ant工具需要一個聯(lián)編文件。創(chuàng)建一個帶有目標(biāo)的build.xml文件(參見清單1),以便編譯EJB源文件并利用編譯好的類文件生成一個JAR 文件。

          build.xml文件復(fù)制到/source目錄。運(yùn)行build.xml中的ejb-jar目標(biāo)。EJB JAR文件生成在source/dist目錄中。EJB JAR可以使用BEA WebLogic appc編譯器來編譯。用appc編譯器來編譯并不是必需的,但這是BEA WebLogic推薦的。

          appc
          appc
          編譯器利用EJB JAR文件生成容器類,并驗(yàn)證部署描述符。在部署EJB JAR文件之前用 appc編譯EJB JAR類的好處是,這樣可以識別出在部署EJB JAR時可能發(fā)生的錯誤。要運(yùn)行 appc編譯器,應(yīng)保證weblogic.jar被包括在Classpath中。appc可以通過以下命令來調(diào)用:

          java weblogic.appc [options] <jar file or directory>

          appc有一些選項(xiàng):

          • -output<file>:指定輸出目錄。
          • -keepgenerated: 保留生成的.java文件。
          • -compiler<java>: Java編譯器設(shè)置成可用。

          部署EJB
          要部署一個實(shí)體EJBJAR文件,必須有一個帶有Java命名和目錄接口(Java Naming and Directory InterfaceJNDI)名稱的數(shù)據(jù)源。在我以前的文章(WLDJ, Vol. 3, issue 1)中我已解釋了如何創(chuàng)建連接池(Connection Pool)。用JNDI "examples-dataSource-demoPool" 創(chuàng)建一個Tx Datasource。這個JNDI 名應(yīng)該與weblogic-cmp-rdbms-jar.xml部署描述符文件的 <data-source-name>元素中指定的名稱相一致。

          為了部署實(shí)體EJB JAR文件,在管理控制臺(administration console)中選擇Deployments>EJB Modules節(jié)點(diǎn)。單擊Deploy a new EJB Module鏈接(見圖1)。

          這時會顯示出Deploy an EJB Module窗體(見圖2)。在Deploy an EJB Module 窗體中選擇 upload your files(s) 鏈接。接著將會顯示一個Upload and Install an Application or Module 窗體。選擇一個要上載的EJB JAR文件,并單擊Upload按鈕。

          這時會顯示出Deploy an EJB Module窗體。選擇myserver鏈接。接著可以看到myserver目錄中的子目錄列表。單擊upload directory鏈接。在upload目錄中選擇要部署的EJB JAR,并單擊Target Module按鈕(見圖3)。這時會顯示一個Select Targets for this EJB module窗體(見圖4)。

          Select targets for this EJB module窗體中選擇一個或多個目標(biāo)服務(wù)器,并單擊Continue按鈕。在接著顯示出的窗體中,在Name字段中指定用于要部署的EJB模塊的名稱(見圖5)。

          單擊Deploy按鈕以部署EJB JAR文件。這樣一來,EJB JAR將被部署到服務(wù)器上,并且有一個EJB節(jié)點(diǎn)被添加到EJB Modules節(jié)點(diǎn)中(見圖6)。

          EJB應(yīng)用程序還可以部署到BEA WebLogic Server上,方法是將EJB JAR文件復(fù)制到該應(yīng)用程序要部署到的那個域上的applications目錄中。

          BEA WebLogic為在 WebLogic服務(wù)器上部署EJB提供了一些建議。

          1. 應(yīng)該將EJB作為企業(yè)歸檔應(yīng)用程序(EAR應(yīng)用程序)中的一個EJB JAR來部署,以利于應(yīng)用程序的移植和修改。
          2. 引用了其他EJBEJB應(yīng)該部署在相同的應(yīng)用程序中;weblogic-ejb-jar.xml中的enable-call-by-reference元素應(yīng)該設(shè)置成True,以獲得更好的性能。
          3. 部署在WebLogic服務(wù)器群集上的EJB應(yīng)該其次地(homogeneously)部署到群集內(nèi)每一臺受管的服務(wù)器上。如果一個EJB只需部署到群集內(nèi)的一臺服務(wù)器上,那么在部署之前應(yīng)使用appc編譯器先對 EJB進(jìn)行編譯。

          結(jié)束語
          EJB
          應(yīng)用程序的開發(fā)包括創(chuàng)建EJB類、編譯EJB類和利用編譯好的EJB類創(chuàng)建一個JAR文件,以及將EJBJAR部署到BEA WebLogic Server。通過遵循關(guān)于設(shè)計、生成和部署EJB JARBEA WebLogic Server上的一些建議,EJB應(yīng)用程序的性能得到了提高。

          參考資料

          l           Programming WebLogic Enterprise JavaBeans: http://edocs.bea.com/wls/docs8.1/ejb/index.html

          關(guān)于作者

          Deepak Vohra 是一名 Web 開發(fā)人員,同時也是一名 NuBean 顧問。

          Ajay Vohra Compuware 公司的一名高級軟件工程師。

          Listing 1:  build.xml file
          <project name="example-entity-ejb" default="all" basedir=".">
            <property name="source" value="."/>
             <property name="ejb" value="ejb20/basic/containrManaged"/>
            <property name="build" value="{source}/build"/>
             <property name="j2sdkee" value="c:/j2sdkee1.3.1"/>
            <property name="dist" value="{source}/dist"/>
           
            <target name="init">
              <!-- Create the time stamp -->
              <tstamp/>
              <mkdir dir="{build}"/>
              <mkdir dir="{build}/META-INF"/>
              <mkdir dir="{dist}"/>
            </target>
            <target name="ejb">
              <javac srcdir="{source}" classpath="{j2sdkee}/lib/j2ee.jar"
                         destdir="{build}" includes="{ejb}/*.java"/>
              <copy  todir="{build}/META-INF">
              <fileset   dir="META-INF" includes="*.xml" />
              </copy>
            </target>
            <target name="ejb-jar" depends="ejb">
              <jar jarfile="{dist}/entityejb.jar" includes="META-INF/*.xml,
                         {ejb}/*.class" basedir="{build}"/>
            </target>
          </project>
          posted on 2005-07-13 00:58 笨笨 閱讀(335) 評論(0)  編輯  收藏 所屬分類: J2EEALL
          主站蜘蛛池模板: 灯塔市| 原平市| 同德县| 陕西省| 金坛市| 闻喜县| 怀仁县| 清河县| 江口县| 安庆市| 宁夏| 雅安市| 连城县| 景谷| 全南县| 定西市| 元阳县| 明水县| 团风县| 报价| 揭阳市| 辉南县| 遂溪县| 崇信县| 且末县| 徐汇区| 武陟县| 宁武县| 五台县| 洪洞县| 黔西县| 资兴市| 浠水县| 柘荣县| 宜丰县| 曲阳县| 宁晋县| 云南省| 吉水县| 和平区| 邵东县|