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

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

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

    kapok

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

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

    http://zh.objectweb.org/JOnAS/gb/PG_Transaction.html

    事務(wù)處理行為

    面向的讀者和內(nèi)容提要



    本文面向的讀者主要是企業(yè)bean的提供者,例如負(fù)責(zé)在服務(wù)器端開發(fā)組件的程序員。本文解釋了如何定義EJB應(yīng)用程序的事務(wù)處理.

    以下是本文的內(nèi)容提要:

    1. 面向的讀者和本文的內(nèi)容提要

    2. 聲明性的事務(wù)管理

    3. BEAN管理的事務(wù)

    4. 分布事務(wù)管理

    聲明性的事務(wù)管理

    在容器管理事務(wù)這種事務(wù)管理方式的情況下,企業(yè)BEAN的事務(wù)處理行為是在配置時被定義的,具體體現(xiàn)在標(biāo)準(zhǔn)部署描述符文件中的集成描述符元素( assembly-descriptor element)部分中. 在配置時我們可以為同一BEAN中所有的方法(methods)同時定義一個共通的事務(wù)處理行為,也可以為每個方法( methods )分別定義不同的事務(wù)處理行為 . 我們通過指定事務(wù)屬性來配置事務(wù)的行為.事務(wù)的屬性有如下幾種:

    • NotSupported:如果該方法是在一個事務(wù)上下文中被調(diào)用,那么該方法執(zhí)行過程中,該事務(wù)將被掛起.

    • Required:如果該方法是在一個事務(wù)上下文中被調(diào)用,該方法在該事務(wù)上下文中執(zhí)行.否則(該方法不在一個事務(wù)上下文中被調(diào)用),在該方法執(zhí)行前,容器將自動生成一個新的事務(wù),隨后該方法在新的事務(wù)上下文中執(zhí)行,并且在該方法結(jié)束時,容器將自動提交這個被自動生成新的事務(wù).

    • RequiresNew:該方法總是要求在一個新的事務(wù)上下文中執(zhí)行.在該方法執(zhí)行前,容器將自動生成一個新的事務(wù),并且在該方法結(jié)束返回時,容器將自動提交這個被自動生成的新事務(wù).如果該方法是在一個事務(wù)上下文中被調(diào)用,那么新的事務(wù)開始時,該事務(wù)將被掛起,并且新事務(wù)結(jié)束后,該事務(wù)將重啟.

    • Mandatory:該方法總是要求在一個事務(wù)上下文中被調(diào)用.否則,容器將拋出 TransactionRequired 例外.

    • Supports:該方法如果在一個事務(wù)上下文中被調(diào)用,那么該方法將在該事務(wù)上下文中執(zhí)行.如果該方法的調(diào)用者不處在事務(wù)上下文中,那么該方法也就不在任何事務(wù)上下文中執(zhí)行.

    • Never:該方法要求該方法的調(diào)用者不能處在事務(wù)上下文中.否則,容器將拋出 RemoteException 例外.

    表格說明如下:

    事務(wù)屬性

    調(diào)用者事務(wù)

    企業(yè)BEAN方法(METHOD)的事務(wù)

    NotSupported

    -

    T1

    -

    -

    Required

    -

    T1

    T2

    T1

    RequiresNew

    -

    T1

    T2

    T2

    Mandatory 

    -

    T1

    錯誤

    T1

    Supports

    -

    T1

    -

    T1

    Nervere

    -

    T1

    -

    錯誤



    根據(jù)EJB規(guī)范書要求,事務(wù)屬性在部署描述符的集成描述符(assembly - descriptor)中設(shè)定,例如:

      <assembly-descriptor>
        <container-transaction>
          <method>
          <ejb-name>AccountImpl</ejb-name>
          <method-name>*</method-name>
          </method>
          <trans-attribute>Supports</trans-attribute>
        </container-transaction>
        <container-transaction>
          <method>
          <ejb-name>AccountImpl</ejb-name>
          <method-name>getBalance</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
        <container-transaction>
          <method>
          <ejb-name>AccountImpl</ejb-name>
          <method-name>setBalance</method-name>
          </method>
          <trans-attribute>Mandatory</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
        

    在本例中,對于AccountImpl bean的所有沒有用container-transaction元素作明確指定的方法, 使用缺省事務(wù)屬性Supports(匹配符*指定缺省事務(wù)屬性,適用于該BEAN所有方法( method )).并且明確指定getBalance 和 setBalance 方法的事務(wù)屬性分別是 Required 和 Mandatory (通過給定特定的 方法method名).

    BEAN管理的事務(wù)

    對于自己管理自己事務(wù)的BEAN,必須在標(biāo)準(zhǔn)部署描述符中設(shè)定其對應(yīng)的 transaction-type元素.例如下:

      <transaction-type>Bean</transaction-type>
        

    對于BEAN自己管理的事務(wù),BEAN程序員應(yīng)該使用javax.transaction.UserTransaction來界定事務(wù)邊界.該接口(interface)javax.transaction.UserTransaction由EJB服務(wù)器在服務(wù)器內(nèi)部一個對象上實現(xiàn).可以通過調(diào)用EJBContext.getUserTransaction()來獲得該接口(這兒的EJBContext根據(jù)bean的種類session BEAN或entity bean的不同而不同, 在session bean 中 EJBContext指 SessionContext,而在 entity bean EJBContext指 EntityContext ).下面的就是一個例子,在 session bean的"doTxJob" 方法中界定事務(wù)邊界; UserTransaction 對象(接口)通過 sessionContext對象獲取.其中sessionContext對象在BEAN初始化方法 setSessionContext(BEAN初始化時自動被EJBserver調(diào)用)中作為參數(shù)傳遞過來.(這意味著BEAN程序員應(yīng)該在setSessionContext中將該 sessionContext對象保存在BEAN的變量中).(參考 example of the session bean).

    public void doTxJob() throws  RemoteException {
         UserTransaction ut = sessionContext.getUserTransaction();
         ut.begin();
         ... // transactional operations
         ut.commit();
    }

    另一個獲得接口 UserTransaction 的方法是用 JNDI ,即在初始化上下文中通過使用 java:comp/UserTransaction名字來獲取.

    分布事務(wù)管理

    正如前面部分所講,一個應(yīng)用程序的事務(wù)行為可以通過聲明的方式來定義,也可以由BEAN或BEAN的調(diào)用者分別,或BEAN和BEAN的調(diào)用者協(xié)助,用編程的方式在代碼中指定(界定事務(wù)邊界).不管在哪中情況下,事務(wù)的分布特性這方面,無論對BEAN提供者(bean provider) 還是對應(yīng)用集成商(application assembler.)來說都是完全透明的.這意味著一個事務(wù)可能有多個在不同的EJB服務(wù)器上的BEAN參與,而平臺應(yīng)該自己從全局角度管理分布事務(wù).平臺在多個不同的服務(wù)器間使用兩相提交協(xié)議(two phase commit )來管理分布事務(wù),從而BEAN程序員不用考慮事務(wù)的分布特性這方面.

    在 been已經(jīng)開發(fā)完成,并且應(yīng)用集成結(jié)束后,部署人員 (deployer)或管理員( administrator )也可以將不同的BEAN配置分布在同一或多個不同的機器上的同一或多個不同的EJB服務(wù)器里.

    這種配置過程可以在不涉及到代碼的變動或部署描述符的修改的情況下完成.The distributed configuration is specified at launch time: in the environment properties of an EJB server, you may specify分布事務(wù)的配置是在EJB服務(wù)器啟動時進行進行:所以分布事務(wù)的配置在EJB服務(wù)器的環(huán)境配置文件中設(shè)定.設(shè)定如下:

    • EJB服務(wù)器將管理哪些企業(yè)BEAN

    • 指定是否在該EJB服務(wù)器的JVM內(nèi)同時啟動一個Java Transaction Monitor(JTM).



    這須通過設(shè)定環(huán)境配置文件 jonas.properties 里的jonas.service.ejb.descriptors 和 jonas.service.jtm.remote項來完成.前一個列出該EJB服務(wù)器中管理的所有企業(yè)BEAN(通過指定部署描述符文件名或ejb-jar文件名),后一個設(shè)定Java Transaction Monitor(JTM)啟動模式:

    • 如果設(shè)為true,那么JTM使用遠(yuǎn)程方式,即在該EJB服務(wù)器啟動前,必須在另一個JVM中已經(jīng)啟動JTM


    • if set to false, the JTM is local, i.e. it will run into the same JVM as the EJB Server. 如果設(shè)為false,那么JTM使用本地方式,即該EJB服務(wù)器的JVM中同時啟動一個JTM

    例如:

      jonas.service.ejb.descriptors       Bean1.xml, Bean2.xml
      jonas.service.jtm.remote            false
        

    JTM可運行在單獨的JVM中,而不必一定運行于某個EJB服務(wù)器內(nèi).在這種情況下,可以如下命令文單獨啟動JTM:

    TMServer

    通過這種靈活的配置方式,就可根據(jù)資源(CPU或數(shù)據(jù)源)的具體情況而采用不同的配置,從而得到最佳的系統(tǒng)性能.

    如下例圖是針對三個企業(yè)BEAN而采用四種不同配置,

    1. 第1種情況: 三個企業(yè)BEAN B1, B2 and B3 分布在同一個EJB服務(wù)器內(nèi),EJB服務(wù)器內(nèi)同時啟動了一個Java Transaction Monitor.

    2. 第2種情況: 三個企業(yè)BEAN分別分布在不同的EJB服務(wù)器內(nèi),其中有只有一個EJB服務(wù)器內(nèi)啟動了一個Java Transaction Monitor,用于管理全局分布事務(wù).

    3. 第3種情況:三個企業(yè)BEAN分別分布在不同的EJB服務(wù)器內(nèi),JTM運行在每個單獨的JVM中.

    4. 第4種情況:三個企業(yè)BEAN分別分布在不同的EJB服務(wù)器內(nèi). 每個EJB服務(wù)器內(nèi)啟動了一個Java Transaction Monitor. 其中一個作為主監(jiān)視器( master monitor),另外兩個為附屬監(jiān)視器( slaves. )

    這些不同的配置情況可通過配置EJB 服務(wù)器對應(yīng)的環(huán)境屬性配置文件,再啟動 EJB 服務(wù)器來實現(xiàn),有些情況下也要啟動JTM(第3種情況).基本原則是應(yīng)該根據(jù)資源的位置和負(fù)載均衡來作出合適的選擇.以下幾點說明,以供參考:

    • 如果企業(yè)BEAN要求運行于同一臺機器,并且要求相同的EJB服務(wù)器配置,第1種情況應(yīng)該是最佳選擇.

    • 如果企業(yè)BEAN要求運行于不同機器,那么第4種情況應(yīng)該是最佳選擇.因為在這種情況下,本地方式的事務(wù)管理更加合適.

    • 如果企業(yè)BEAN要求運行于同一臺機器,而要求不同的EJB服務(wù)器配置,第2種情況應(yīng)該是好的選擇.


    posted on 2005-03-08 16:43 笨笨 閱讀(803) 評論(0)  編輯  收藏 所屬分類: J2EE 、ALL
    主站蜘蛛池模板: 中文字幕成人免费高清在线| 亚洲高清国产拍精品26U| 亚洲欧美日韩一区二区三区| xxxx日本免费| 亚洲一本大道无码av天堂| 野花视频在线官网免费1| 日本牲交大片免费观看| 亚洲免费观看网站| 国产亚洲AV手机在线观看| 女人隐私秘视频黄www免费| 亚洲AV无码国产精品色| 亚洲欧洲日产专区| 国产性爱在线观看亚洲黄色一级片| 国产精品麻豆免费版| 最近2019中文字幕免费看最新| 最近免费中文字幕大全高清大全1| 国产男女爽爽爽免费视频| eeuss在线兵区免费观看| 四虎国产精品永免费| 中文永久免费观看网站| 久九九精品免费视频| 最近中文字幕免费mv视频8| 国产AV无码专区亚洲AV男同 | 亚洲高清无码在线观看| 日韩一级视频免费观看| 亚洲美女大bbbbbbbbb| 亚洲一区无码中文字幕乱码| 一级黄色免费毛片| 国偷自产一区二区免费视频| 91高清免费国产自产| 亚洲精品你懂的在线观看| 亚洲AV色吊丝无码| 97在线视频免费播放| 亚洲成人网在线观看| 国产精品美女久久久免费| 免费无码H肉动漫在线观看麻豆| 在线a亚洲老鸭窝天堂av高清| 亚洲喷奶水中文字幕电影| 黄页网址大全免费观看12网站| 一级黄色免费毛片| 成人性生活免费视频|