走自己的路

          路漫漫其修遠(yuǎn)兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評(píng)論 :: 0 Trackbacks

          晚上要下班的時(shí)候,application team那里使用Tibco EMS做消息集成服務(wù)時(shí)候出了bug,錯(cuò)誤是:java.sql.SQLException: 當(dāng)全局事務(wù)處理處于活動(dòng)狀態(tài)時(shí), 無法調(diào)用方法 'commit',應(yīng)該是在全局事務(wù)中使用了本地事務(wù)并提交了。幫忙看了一下,它的oc4j, toplink, spring的使用上都存在著一些問題,并把要注意的地方總結(jié)了一下。
           

           Jta外部事務(wù),也稱為分布式事務(wù),全局事務(wù)。

           

          1. oc4j:

          ·         transaction manager知道resource的存在

           

          要使用外部事務(wù),首先要讓transaction manager了解是哪個(gè)resource。我們選擇使用managed resource,這樣由容器來管理:data source, jms resouce, jca resourceoc4jtransaction manager肯定是知道這些managed resource的存在的,可以通過radata-sources.xml來配置,或者直接通過oc4j web console來創(chuàng)建。

                     

          • Oc4j data-sources.xml

           特別要注意的是data source的設(shè)置,oc4j中可以通過data-sources.xml設(shè)置transaction level,默認(rèn)是global,表示join jta外部事務(wù),如果是localoc4j就會(huì)把所有的managed datasource的操作當(dāng)作local connection來看待,這些操作是不join到外部事務(wù)中的。

          什么是一次local transaction操作呢?

          Toplink:每次對(duì)unitofwork的提交。

          Connection的每次提交,auto commit的每次操作。

           

               <managed-data-source name="MIFSystemLogDataSource"

                    connection-pool-name="MIFSysLogConnectionFactory"

                    jndi-name="jdbc/mifStatusLog"  tx-level='global'/>

           

           有人會(huì)問沒有使用xaconnection怎么能使用外部事務(wù)join transaction呢,oracle實(shí)現(xiàn)了稱為Emulating XAoc4j container),它基本上模擬了two phase commit的功能,但是沒有transaction branches,也就是xidbranch標(biāo)識(shí)符,xid包括format標(biāo)識(shí)符, global事務(wù)標(biāo)識(shí)符和branch標(biāo)識(shí)符。也沒有two phase commit的預(yù)提交過程。Toplink在使用session broker時(shí),也有類似的配置,稱為two stage commitxaresource應(yīng)該配置成globaltransaction,否則沒必要用xa

           

          • Oc4j中如何自己控制transaction

          有時(shí)我們可能需要自己控制transaction,這樣我們可能需要在oc4j中獲得受管的UserTransactionTransactionManagerTransactionManager可以suspendresume一個(gè)transaction,實(shí)現(xiàn)諸如requires new這樣的功能。

                Context initialContext = new InitialContext();

                UserTransaction userTrx = (javax.transaction.UserTransaction) initialContext.lookup("java:comp/UserTransaction");

                      if (ut instanceof TransactionManager) {

                                  TransactionManager tm = (TransactionManager) userTrx;

           

          }

           

          • 如果使用的是分布式全局transaction不建議在程序中調(diào)用connection.setAutoCommit(true), connection.commit(), commit.rollback()方法,這樣會(huì)干擾分布式事務(wù)的管理。

          2Toplink

           

          • 如果toplink需要跨多個(gè)data source,請(qǐng)使用session broker

          <session>

          <name>EmployeeSession</name>

          ...

          </session>

          <session>

          <name>ProjectSession</name>

          ...

          </session>

          /* Configure the SessionBroker */

          <session-broker>

          /* Name the SessionBroker */

          <name>EmployeeAndProjectBroker</name>

          /* Specify the sessions contained in the SessionBroker */

          <session-name>EmployeeSession</session-name>

          <session-name>ProjectSession</session-name>

          </session-broker>

           

          • 如果toplink的操作想join到外部事務(wù),或者說使用two phase commit,需要在session中激活使用是用外部事務(wù),可以通過sessions.xml配置:

          <external-transaction-controller>true</external-transaction-controller>

           

           

          3Spring

           

          • 使用外部事務(wù)

                <bean name="transactionManager"

                      class="org.springframework.transaction.jta.OC4JJtaTransactionManager" >

                </bean>

           

          或者

                <bean name="transactionManager"

                      class="org.springframework.transaction.jta.JtaTransactionManager" >

                </bean>

           

          • 本地事務(wù)

                <bean name="transactionManager"

                      class=" org.springframework.orm.toplink. TopLinkTransactionManager " >

                    <property name="sessionFactory" ref="sessionFactory" />

                </bean>




          評(píng)論

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2008-11-15 11:14 life126.com
          總感覺這樣做會(huì)很不穩(wěn)定,現(xiàn)在數(shù)據(jù)庫供應(yīng)商的多數(shù)據(jù)源事務(wù)也沒有很好的解決辦法  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得[未登錄] 2008-11-18 22:20 vv
          怎么用這么怪的技術(shù),比hibernate等成熟的開源技術(shù)有什么優(yōu)勢(shì)?  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2008-11-19 11:15 ldd600
          @vv
          您的意思是說toplink用起來很怪?我說一下我的看法:
          1.toplink是開源的但并不完全,toplink internal沒有開源
          2.eclipselink是完全開源的,是toplink的升級(jí)版本,貌似將作為jpa2.0的參考實(shí)現(xiàn)
          3.toplink有很強(qiáng)大可視化的orm工具而且它的mapping功能也是很強(qiáng)大的
          4.它oracle數(shù)據(jù)庫 oracle ias整合還是很完美的,畢竟是oracle的產(chǎn)品
          5.其實(shí)不能說toplink就怎么怎么不好,各有各的長處吧。可能toplink沒有hibernate用的那么普遍。  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2008-11-19 11:40 ldd600
          @life126.com
          現(xiàn)在很多企業(yè)級(jí)應(yīng)用應(yīng)該都使用了分布式事務(wù)吧,而且數(shù)據(jù)庫廠商競爭那么激烈,分布式事務(wù)(xa接口)應(yīng)該都實(shí)現(xiàn)了,成熟不成熟也見仁見智了吧。  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 00:53 yanical
          大致按你說的做了,出了個(gè)問題:
          Exception Description: Sequencing login should not use External Transaction Controller.
          網(wǎng)上查了一下,我覺得是datasource配置錯(cuò)了,該怎么配?  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 09:30 ldd600
          不知道您是否顯式的配置了sequence用的connection pool,sequence(identity id)的申請(qǐng)是不能用jta的,請(qǐng)不要顯式的設(shè)置它,保持默認(rèn)就可以了。不知道您是否方便把您的sessions.xml發(fā)給我,我們一起看一下。  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 11:51 yanical

          <login xsi:type="database-login">
          <platform-class>oracle.toplink.platform.database.oracle.Oracle10Platform</platform-class>
          <external-connection-pooling>true</external-connection-pooling>
          <external-transaction-controller>false</external-transaction-controller>
          <sequencing>
          <default-sequence xsi:type="table-sequence">
          <name>Custom</name>
          <preallocation-size>50</preallocation-size>
          <table>SEQUENCE</table>
          </default-sequence>
          </sequencing>
          <datasource>%%DS_LOCATION%%</datasource>
          <bind-all-parameters>true</bind-all-parameters>
          <batch-writing>true</batch-writing>
          </login>
          <connection-pools>
          <sequence-connection-pool>
          <name>SequenceConnectionPool</name>
          <max-connections>10</max-connections>
          <min-connections>2</min-connections>
          <login xsi:type="database-login">
          <external-connection-pooling>true</external-connection-pooling>
          <external-transaction-controller>true</external-transaction-controller>
          <sequencing>
          <default-sequence xsi:type="table-sequence">
          <name>Custom</name>
          <table>SEQUENCE</table>
          </default-sequence>
          </sequencing>
          <datasource>%%DS_LOCATION%%</datasource>
          </login>
          </sequence-connection-pool>
          </connection-pools>
          這是主要部分,之前把兩個(gè)external-transaction-controller都設(shè)成true,
          拋Exception Description: Sequencing login should not use External Transaction Controller.
          現(xiàn)在上面那個(gè)設(shè)成false,可以啟動(dòng)系統(tǒng),但是程序中調(diào)用assignSequenceNumber時(shí)就拋異常:有外部transaction,不能commit.
          謝謝幫看一下  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 11:58 yanical
          不好意思,好像一調(diào)用數(shù)據(jù)庫操作就會(huì)
          The method 'commit' cant be called
          when a global transaction is active.  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 17:00 ldd600
          我覺得上面應(yīng)該設(shè)成true,下面設(shè)成false,您可以試一下。  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 17:48 yanical
          不行啊,Exception Description: Sequencing login should not use External Transaction Controller.  回復(fù)  更多評(píng)論
            

          # re: oc4j+toplink+spring使用jta外部事務(wù)的一點(diǎn)心得 2009-07-12 19:57 ldd600
          可以不用為sequence設(shè)置pool,它可以自動(dòng)重用先前你配置的xa pool的,只是會(huì)增加沖突率,可以適當(dāng)?shù)脑黾宇A(yù)取的oid數(shù),我們公司的應(yīng)用項(xiàng)目組應(yīng)該是這么配置的。

          不好意思,顯著的把它設(shè)成false也是錯(cuò)誤的,我一開始以為它會(huì)suspend掉jta transaction。如果考慮到其他問題你可以單獨(dú)為它設(shè)一個(gè)local的datasource吧。

          <managed-data-source name="myLocalDS"
          connection-pool-name="myPool"
          jndi-name="jdbc/myLocalDS"
          tx-level="local"/>

            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 襄樊市| 山阳县| 新建县| 阳信县| 柳林县| 高州市| 车险| 台南县| 乌兰察布市| 灵璧县| 合山市| 光山县| 澄迈县| 洪泽县| 象山县| 交口县| 仁怀市| 滨州市| 额尔古纳市| 汉阴县| 金溪县| 乌拉特前旗| 朝阳县| 仁布县| 土默特左旗| 乌兰县| 象山县| 衡阳县| 五家渠市| 岱山县| 黄冈市| 正安县| 涿州市| 鄂尔多斯市| 宁乡县| 闽清县| 嘉鱼县| 东至县| 枣强县| 靖宇县| 和政县|