<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    銀色幻想

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    學(xué)習(xí)交流

    最新評(píng)論

    EJB筆記

    1、ejb 基礎(chǔ)知識(shí)
    (1) 無(wú)狀態(tài)會(huì)話bean
    不保存客戶機(jī)的會(huì)話狀態(tài)
    優(yōu)點(diǎn):使用小量的實(shí)例即可滿足大量的客戶。每個(gè)實(shí)例都沒有標(biāo)識(shí),相互之間是等價(jià)的。
    等?的無(wú)狀態(tài)會(huì)話bean: 多次和一次調(diào)用的結(jié)果和效應(yīng)相同。
    在集群中可以負(fù)載均衡 a 機(jī)器失敗,可以在b機(jī)器上重試
    非等?的無(wú)狀態(tài)會(huì)話bean: 如:計(jì)數(shù)器
    不能自動(dòng)因故障而進(jìn)行切換。
    (2) 有狀態(tài)會(huì)話bean
    保存客戶機(jī)的會(huì)話狀態(tài)
    特點(diǎn): 在有會(huì)話狀態(tài)會(huì)話的bean例子中,出納員的數(shù)量等于活動(dòng)的顧客的數(shù)量,這可以簡(jiǎn)化編程模式
    weblogic 通過(guò)內(nèi)存復(fù)制技術(shù) 在集群中進(jìn)行負(fù)載均衡
    內(nèi)存復(fù)制技術(shù): 每個(gè)有會(huì)話狀態(tài)的bean實(shí)例都將存儲(chǔ)在兩個(gè)服務(wù)器的內(nèi)存中,一個(gè)服務(wù)器作為主服務(wù)器,另一個(gè)作為輔助服務(wù)器。
    如果主失敗,輔助變?yōu)橹?,然后自?dòng)選擇別的可用的服務(wù)器作為輔助。
    遺憾: 很難在Servlet 和JSP中用好有狀態(tài)會(huì)話bean??赡軙?huì)發(fā)生并發(fā)現(xiàn)象,產(chǎn)生RemoteException

    weblogic 的<allow-concurrent-calls> 可以封鎖任何并發(fā)的調(diào)用。
    同步: 可以有選擇地實(shí)現(xiàn) Javax.ejb.SessionSynchronization接口
    afeterBegin() //進(jìn)入事務(wù)時(shí)
    beforeCompletion() //提交事務(wù)前,用于提交前把緩存的數(shù)據(jù)寫到數(shù)據(jù)庫(kù)中.
    afterCompletion() //提交事務(wù)后,用于釋放共享資源或者更新事務(wù)提交和終止方面的統(tǒng)計(jì)信息.
    會(huì)話bean通過(guò)其 SessionContext 對(duì)象中的 getUserTransaction() 方法,取得對(duì)UserTransaction的應(yīng)用
    通常 SessionContext 被存放在成員變量中
    ** 記住是在調(diào)用ejb.create()方法前調(diào)用 setUserTransaction() 方法
    利用對(duì) UserTransaction 的引用會(huì)話可以使用 begin() 、commit()、rollback() 方法界定一個(gè)事務(wù).


    (3) 實(shí)體 bean:
    它有一個(gè)主健作為唯一的標(biāo)識(shí)符
    組成部分: 由本地接口、遠(yuǎn)程接口、bean類、主健類和配置描述器組成。
    本地接口:
    擴(kuò)展了javax.ejb.EJBHome接口,包括create()、remove()、finder 和home等方法
    1)create()方法調(diào)用bean類中的ejbCreate()方法。相當(dāng)于數(shù)據(jù)的insert 方法。
    2)remove()方法相當(dāng)于數(shù)據(jù)庫(kù)的delete操作。
    3)finder()方法,使客戶能夠查詢和接收滿足查詢條件的實(shí)體bean的引用。每個(gè)實(shí)體bean的本地接口中都必須
    有一個(gè)findByPrimaryKey() 方法
    4)home 方法,類似于無(wú)狀態(tài)會(huì)話bean。
    主健類:
    實(shí)體bean必須包括一個(gè)主健類,主健類用于標(biāo)識(shí)實(shí)體bean實(shí)例,而且實(shí)體bean數(shù)據(jù)類型必須是唯一的。
    主健類可以是java的基本類型String Integer 也可以是用戶自定義的。
    也可以是多個(gè)字段的主健的復(fù)合主健。
    bean 類和bean的上下文環(huán)境:
    實(shí)現(xiàn)javax.ejb.EJBObject 接口,其中包含業(yè)務(wù)方法的語(yǔ)法格式定義.
    bean 類實(shí)現(xiàn)了javax.ejb.EntityBean接口,同javax.ejb.SessionBean接口一樣,EntityBean 接口包含了EJB
    容器調(diào)用bean實(shí)例的語(yǔ)法格式.
    在bean的構(gòu)造器執(zhí)行之后,立即調(diào)用setEntityContext() 方法,同時(shí)把bean實(shí)例的EntityContext 傳遞給它.
    bean類實(shí)現(xiàn)了home方法和遠(yuǎn)程接口中的業(yè)務(wù)方法,home方法是針對(duì)匿名實(shí)例的方法不應(yīng)使用有關(guān)的主健值.

    分為:
    容器管理持久性(Container-Managerd Persistence)CMP
    特點(diǎn): EJB 容器自動(dòng)生成,用于把實(shí)體bean的數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)中。
    優(yōu)點(diǎn): bean作者可以避免編寫實(shí)體bean與關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)訪問方面的代碼。cmp將自動(dòng)處理這一過(guò)程。
    個(gè)性: 每一個(gè)cmp 實(shí)體bean 都有一組容器管理的字段,這些字段存儲(chǔ)在數(shù)據(jù)庫(kù),并可從中加載.通常,每個(gè)容器管理的字段都對(duì)應(yīng)于
    關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)列.
    容器管理的每個(gè)字段必須在ejb-jar.XML中定義,這使容器能夠把容器管理的字段與bean類中的set和get方法進(jìn)行匹配比較.
    另外,bean作者可以增加另外一個(gè)cmp配置描述文件 weblogic-cmp-rdbms.xml,其中包含數(shù)據(jù)庫(kù)表名和每個(gè)容器管理的字
    段和相應(yīng)的數(shù)據(jù)列的映射.

    bean管理持久性(Bean-Managerd Persistence ) BMP
    特點(diǎn): 在bmp實(shí)體中,bean作者需要自己編寫數(shù)據(jù)庫(kù)訪問代碼,也就是編寫JDBC代碼,插入、刪除和查詢數(shù)據(jù)庫(kù)中的實(shí)體bean數(shù)據(jù)。
    優(yōu)點(diǎn): 可以讓bean的作者完全靈活的處理實(shí)體bean的持久性數(shù)據(jù),因?yàn)樽髡咝枰獙憯?shù)據(jù)訪問的代碼,他幾乎可以使用任何持久性存
    儲(chǔ)方式ejb2.0 cmp提供實(shí)體bean之間的標(biāo)準(zhǔn)關(guān)系映射,使容器能自動(dòng)管理業(yè)務(wù)對(duì)象之間的交互。
    cmp擁有更多的訪問控制,因此cmp比bmp有較好的性能。

    (4) 消息 bean
    把JMS 和EJB 成功結(jié)合在一起,集成的結(jié)果
    特點(diǎn):客戶機(jī)不需要調(diào)用消息bean 相反: 客戶機(jī)只需要發(fā)一個(gè)消息給jMS目的。
    在消息到達(dá)以后,消息bean的onmessage()方法將被調(diào)用,以處理這個(gè)消息。
    消息bean用于在服務(wù)器中執(zhí)行異步操作。

    2。EJB 組成
    (1)遠(yuǎn)程接口
    public interface HelloWord extents EJBObject

    //EJBObject 接口方法
    EJBHome getEJBHome() throws RemoteException;

    Object getPrimaryKey() throws RemoteException;

    void remove() throws RemoteException, RemoveException;

    Handle getHandle() throws RemoteException;

    boolean isIdentical(EJBObject ejbObject) throws RemoteException;

    (2)本地接口
    本地接口是ejb工廠,客戶機(jī)可以使用本地接口創(chuàng)建、找出和刪除ejb實(shí)例。只需寫本地接口中的方法的語(yǔ)法調(diào)用格式
    public class HelloWorldHome extends EJBHome

    //EJBHome 接口方法
    void remove(Handle handle) throws RemoteException, RemoveException;

    void remove(Object o) throws RemoteException, RemoveException;

    EJBMetaData getEJBMetaData() throws RemoteException;

    HomeHandle getHomeHandle() throws RemoteException;
    // Home
    public HelloWorld create() throws CreateException, RemoteException;


    (3)bean 類

    public class HelloWorldBean implements SessionBean

    // SessionBean 中的方法
    public void setSessionContext(SessionContext sessionContext)
    /**調(diào)用次方法會(huì)話結(jié)束*/
    public void ejbRemove()
    //ejb通過(guò)待命和活動(dòng)的機(jī)制,管理一組正在工作的有狀態(tài)會(huì)話bean實(shí)例
    /**活動(dòng)*/
    public void ejbActivate()
    /**待命*/
    public void ejbPassivate()
    // bean類
    // 每個(gè)home 的create 方法對(duì)應(yīng)一個(gè)ejbCreate()方法
    // 有會(huì)話狀態(tài)有很多不同版本的create()方法。而create 方法必須有ejbCreate()方法與之一一對(duì)應(yīng)
    public void ejbCreate()




    不要在ejb類中類中實(shí)現(xiàn)遠(yuǎn)程接口
    3. EJB 配置描述器
    (1)ejb-jar.xml
    <ejb-jar> (注釋)
    <entERPrise-beans>
    <session>
    <ejb-name>HelloWorld(ejbname)</ejb-name>
    <home>com.dhc.helloworld.HelloWorldHome(本地接口類)</home>
    <remote>com.dhc.helloworld.HelloWorld(遠(yuǎn)程接口類)</remote>
    <ejb-class>com.dhc.helloworld.HelloWorldBean(bean類)</ejb-class>
    <session-type>Stateless(無(wú)狀態(tài)會(huì)話)</session-type>
    <transaction-type>Bean(bean管理的事務(wù))</transaction-type>
    </session>
    </enterprise-beans>
    <container-transaction>
    <method>
    <ejb-name>ShoppingCartEjb</ejb-name>
    <method-name>*(說(shuō)明ShoppingCartEjb的默認(rèn)事務(wù)屬性指定為Required)</method-name>
    </method>
    <trans-attribute>Required(容器管理的事務(wù)使用的屬性 Nerver、NotSupported
    、Supports、Mandatory、Required、RequiredNew)</trans-attribute>
    </container-transaction>
    </ejb-jar>
    (2)weblogic-ejb-jar.xml (注釋)
    <weblogic-ejb-jar>
    <weblogic-enterprise-bean>
    <ejb-name>HelloWorld(ejb名稱)</ejb-name>
    <jndi-name>HelloWorldEJB(jndi名稱)</jndi-name>
    <max-bean-in-freepool>10(限制不會(huì)有超過(guò)10個(gè)無(wú)狀態(tài)會(huì)話bean并發(fā)運(yùn)行)</max-bean-in-freepool>
    <max-bean-in-cache>10(放到內(nèi)存緩存中的有狀態(tài)會(huì)話bean的最大數(shù)量)</max-bean-in-cache>
    </weblogic-enterprise-bean>
    </weblogic-ejb-jar>

    4 . 建立ejb 檔案文件
    com/dhc/helloworld/(package)
    com/dhc/helloworld/HelloWorld(遠(yuǎn)程接口)
    com/dhc/helloworld/HelloWorldHome(本地接口)
    com/dhc/helloworld/HelloWorldBean(bean類)
    META-INF
    META-INF/ejb-jar.xml(配置描述器)
    META-INF/weblogic-ejb-jar.xml(weblogic服務(wù)器配置描述器)

    說(shuō)明: META-INF 必須為大寫

    5 . 容器管理的事務(wù)
    Nerver : 不參與事務(wù),如果參與產(chǎn)生RemoteException
    NotSupported: 不能參與
    Supports: 如果調(diào)用者正在參與事務(wù),相應(yīng)的EJB調(diào)用也可以參與事務(wù),否則不能
    Mandatory 如果調(diào)用者有一個(gè)事務(wù),相應(yīng)的EJB可以參與事務(wù),否則,TransactionRequiredException
    Required 如果調(diào)用者有一個(gè)事務(wù),相應(yīng)的EJB可以參與事務(wù),否則,容器將在調(diào)用相應(yīng)的EJB之前,開始一個(gè)事務(wù).
    當(dāng)方法調(diào)用完成以后,即提交該事務(wù).
    RequiresNew 在調(diào)用相應(yīng)的EJB之前,開始一個(gè)新的事務(wù),當(dāng)方法調(diào)用返回時(shí),即提交這個(gè)事務(wù).


    6、ejb 引用

    在ejb-jar.xml
    <ejb-ref>
    <description> an EJB reference to the Widget EJB(描述)</description>
    <ejb-ref-name>ejb/WidgetEJB</ejb-ref-name>
    <ejb-ref-type>session</ejb-ref-type>
    <home>com.dhc.WidgetHome</home>
    <remote>com.dhc.Widget</remote>
    </ejb-ref>

    在 weblogic-ejb-jar.xml
    <ejb-reference-description>
    <ejb-ref-name>ejb/WidgeEJB</ejb-ref-name>
    <jndi-name>DeployedWidge</jndi-name>
    </ejb-reference-description>

    程序
    Content ctx = new InitialContent();
    Object h = ctx.lookup("java:/comp/env/ejb"); //環(huán)境變量是只讀的,而且是當(dāng)前ejb的本地變量.
    WidgetHome home = (WidgetHome)PortableRemoteObject.narrow(h,WidgeHome.class);

    7. 資源管理器的引用
    定義資源管理的引用
    例子: 建立 jdbc、DBPool與JDBC數(shù)據(jù)源的映射
    在ejb-jar.xml
    <resource-ref>
    <description>(描述)</description>
    <res-ref-name>jdbc/BDPool</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>

    在 weblogic-ejb-jar.xml
    <resource-description>
    <res-ref-name>jdbc/DBPool</res-ref-name>
    <jndi-name>DBPool</jndi-name>
    </resource-description>

    config.xml

    <JDBCTxDataSource
    name="DBPool"
    Targets="myserver"
    JDDIName="DBPool" (jndi名稱)
    PoolName ="DevelopmentPool"
    />

    引用的優(yōu)點(diǎn)
    我們用大量的映射和配置,才建立了資源管理器的引用,但是還是很值得的。
    以為便于部署人員重新配置應(yīng)用而不需要修改實(shí)際的bean類代碼。甚至也不需要修改ejb的配置描述器
    java bean 代碼

    Content ctx = new InitialContent();
    DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/DBPool");

    8 . 句柄: 作為一個(gè)串行化的對(duì)象,句柄中封裝了足夠的信息,以便重建對(duì)EJBObject的引用。
    句柄可用于在兩個(gè)相互合作的進(jìn)程中傳遞EJBObject的引用。接受進(jìn)程即可從句柄中取得EJBObject的引用。

    為了取得句柄,可以調(diào)用EJBObject接口的getHandle()方法,返回一個(gè)Handle實(shí)例
    為了重建EJBObject 引用。可以使用Handle 接口的getEJBObject()方法。

    例子:
    HelloWorld hw = home.create();
    javax.ejb.Handle handle = hw.getHandle();
    HelloWorld helloworld = (HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class);


    HomeHandle:
    類似handle ,但不能用于引用EJBObject
    HomeHandle 包含足夠的信息,可以重建EJBHome()的引用。
    差異:
    是調(diào)用 getHomeHandle()方法 和getEJBHome()方法
    例子片斷:
    Content ctx = new InitialContext();
    Object h = ctx.lookup("HelloWorldEJB");
    HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class);
    HomeHandle homehandle = home.getHomeHandle();
    Object nh = homehandle.getEJBHome();
    HelloWorldHome newHomeReference = (HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class);

    優(yōu)點(diǎn):
    他們可以自動(dòng)的存儲(chǔ)重建引用所需的信息

    9.使用事務(wù)的技巧:
    (1) 一個(gè)事務(wù)不要涉及太多的操作.
    (2) 容器管理和bean管理的事務(wù)
    事務(wù)既耗費(fèi)應(yīng)用服務(wù)器中的資源,又耗費(fèi)數(shù)據(jù)庫(kù)資源,所以事務(wù)越短越好.
    盡量使用容器管理事務(wù)而不要采用bean管理事務(wù)的方式.
    (3) ejb遇到錯(cuò)誤,需要強(qiáng)制事務(wù)回滾. 使用EJBObject.setRollbackOnly();
    (4) 不能讓事務(wù)涉及web層和表示邏輯
    (5) 企業(yè)應(yīng)用中不應(yīng)當(dāng)選用supports 事務(wù)屬性,因?yàn)橹挥姓{(diào)用者開始一個(gè)事務(wù)后,ejb才能在事務(wù)中運(yùn)行.

    posted on 2006-07-28 10:06 銀色幻想 閱讀(245) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品日韩中文字幕久久久| 亚洲精品乱码久久久久久按摩| 亚洲男人的天堂久久精品| 午夜不卡久久精品无码免费| 国产精品亚洲片在线观看不卡| 国产精品无码永久免费888| 亚洲人成网站18禁止一区| 人人鲁免费播放视频人人香蕉| 亚洲人AV永久一区二区三区久久| 狠狠热精品免费观看| 亚洲精品无码专区2| 成全视频在线观看免费| 久久青青草原亚洲AV无码麻豆 | 亚洲精品国产第一综合99久久| 成年女人免费视频播放77777 | 久久不见久久见免费视频7| 91亚洲精品第一综合不卡播放| 最近免费中文在线视频| 亚洲一区在线免费观看| 日韩成人免费在线| 黄床大片免费30分钟国产精品| 亚洲av无码一区二区三区网站| 免费黄色网址网站| 亚洲精品无码一区二区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 免费成人在线电影| 亚洲中文字幕久久精品无码2021| 在线观看人成网站深夜免费| 成人在线免费视频| 亚洲视频手机在线| 国产大片91精品免费观看男同| 在线观看片免费人成视频播放| 91亚洲国产成人久久精品网址| 免费永久看黄在线观看app| 伊人久久大香线蕉免费视频| 亚洲二区在线视频| 免费一级特黄特色大片在线| 久久免费精品视频| 黄色网址免费在线| 亚洲精品国产福利片| 亚洲国产成人a精品不卡在线|