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

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

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

    風(fēng)人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
    數(shù)據(jù)加載中……

    JTA和JDBC事務(wù) (ZT)

    ?

    ?一般情況下,J2EE應(yīng)用服務(wù)器支持JDBC事務(wù)、JTA事務(wù)、容器管理事務(wù)。這里討論JTA和JDBC事務(wù)的區(qū)別。這2個是常用的DAO模式事務(wù)界定方式。
    JDBC 事務(wù)
    ?JDBC 事務(wù)是用 Connection 對象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動提交和手工提交。例如如下片斷:
    ?import java.sql.*;
    ????? import javax.sql.*;

    ????? // ...
    ????? DataSource ds = obtainDataSource();
    ????? Connection conn = ds.getConnection();
    ????? conn.setAutoCommit(false);
    ????? // ...
    ????? pstmt = conn.prepareStatement("UPDATE MOVIES ...");
    ????? pstmt.setString(1, "The Great Escape");
    ????? pstmt.executeUpdate();
    ????? // ...
    ????? conn.commit();
    ????? // ...

    ?JDBC 事務(wù)的一個缺點是事務(wù)的范圍局限于一個數(shù)據(jù)庫連接。一個 JDBC 事務(wù)不能跨越多個數(shù)據(jù)庫。
    JTA事務(wù)
    ?JTA(Java Transaction API) 為 J2EE 平臺提供了分布式事務(wù)服務(wù)。
    ?要用 JTA 進行事務(wù)界定,應(yīng)用程序要調(diào)用 javax.transaction.UserTransaction 接口中的方法。例如:
    ?utx.begin();
    ????? // ...
    ????? DataSource ds = obtainXADataSource();
    ????? Connection conn = ds.getConnection();
    ????? pstmt = conn.prepareStatement("UPDATE MOVIES ...");
    ????? pstmt.setString(1, "Spinal Tap");
    ????? pstmt.executeUpdate();
    ????? // ...
    ????? utx.commit();

    ?讓我們來關(guān)注下面的話:
    ?“用 JTA 界定事務(wù),那么就需要有一個實現(xiàn) javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅(qū)動程序。一個實現(xiàn)了這些接口的驅(qū)動程序?qū)⒖梢詤⑴c JTA 事務(wù)。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務(wù)的 JDBC 連接。”
    ?要使用JTA事務(wù),必須使用XADataSource來產(chǎn)生數(shù)據(jù)庫連接,產(chǎn)生的連接為一個XA連接。
    ?XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區(qū)別在于:XA可以參與JTA的事務(wù),而且不支持自動提交。
    ???? Note:
    Oracle, Sybase, DB2, SQL Server等大型數(shù)據(jù)庫才支持XA, 支持分布事務(wù)。
    My SQL 連本地都支持不好,更別說分布事務(wù)了。
    JTA方式的實現(xiàn)過程
    ?? 用XADataSource產(chǎn)生的XAConnection它擴展了一個getXAResource()方法,事務(wù)通過這個方法把它加入到事務(wù)容器中進行管理.對于調(diào)用者來說,根本看不到事務(wù)是如果管理的,你只要聲明開始事務(wù),告訴容器我下面的操作要求事務(wù)參與了,最后告訴事務(wù)說到這兒可以提交或回滾了,別的都是黑箱操作。
    ?在使用JTA之前,你必須首先實現(xiàn)一個Xid類用來標識事務(wù)(在普通情況下這將由事務(wù)管理程序來處理)。Xid包含三個元素:formatID、gtrid(全局事務(wù)標識符)和bqual(分支修飾詞標識符)。
    ?下面的例子說明Xid的實現(xiàn):

    import javax.transaction.xa.*;
    public class MyXid implements Xid
    {
     protected int formatId;
     protected byte gtrid[];
     protected byte bqual[];
     public MyXid()
     {
     }
     public MyXid(int formatId, byte gtrid[], byte bqual[])
     {
      this.formatId = formatId;
      this.gtrid = gtrid;
      this.bqual = bqual;
     }

     public int getFormatId()
     {
      return formatId;
     }

     public byte[] getBranchQualifier()
     {
      return bqual;
     }

     public byte[] getGlobalTransactionId()
     {
      return gtrid;
     }

    }
    ?其次,你需要創(chuàng)建一個你要使用的數(shù)據(jù)庫的數(shù)據(jù)源:

    public DataSource getDataSource()
     throws SQLException
     {
      SQLServerDataSource xaDS = new
      com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
      xaDS.setDataSourceName("SQLServer");
      xaDS.setServerName("server");
      xaDS.setPortNumber(1433);
      xaDS.setSelectMethod("cursor");
      return xaDS;
    }

      例1?這個例子是用“兩步提交協(xié)議”來提交一個事務(wù)分支:

    XADataSource xaDS;
    XAConnection xaCon;
    XAResource xaRes;
    Xid xid;
    Connection con;
    Statement stmt;
    int ret;
    xaDS = getDataSource();
    xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
    xaRes = xaCon.getXAResource();
    con = xaCon.getConnection();
    stmt = con.createStatement();
    xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
    try {
      xaRes.start(xid, XAResource.TMNOFLAGS);
      stmt.executeUpdate("insert into test_table values (100)");
      xaRes.end(xid, XAResource.TMSUCCESS);
      ret = xaRes.prepare(xid);
      if (ret == XAResource.XA_OK) {
        xaRes.commit(xid, false);
       }
    }
    catch (XAException e) {
     e.printStackTrace();
    }
    finally {
     stmt.close();
     con.close();
     xaCon.close();
    }
    ?當然,實際過程中,我們不需要寫這些代碼,這些代碼是JTA最終的實現(xiàn)代碼。
    關(guān)于“兩步提交協(xié)議”,可以參看下面的文章:
    http://www.jspcn.net/htmlnews/11049371131251752.html

    ?http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html


    選擇最好的方式
    用 JDBC API 進事務(wù)界定來構(gòu)建 DAO 類的。這些 DAO 類可以總結(jié)如下:

    事務(wù)界定代碼嵌入在 DAO 類中。
    DAO 類使用 JDBC API 進行事務(wù)界定。
    調(diào)用者不能界定事務(wù)。
    事務(wù)范圍局限于單個 JDBC 連接。
    JDBC 事務(wù)并不總是適合復(fù)雜的企業(yè)應(yīng)用程序。如果您的事務(wù)要跨越多個 DAO 或者多個數(shù)據(jù)庫,那么下列實現(xiàn)策略也許更合適:

    事務(wù)用 JTA 界定。
    事務(wù)界定代碼從 DAO 中分離出來。
    調(diào)用者負責(zé)界定事務(wù)。
    DAO 加入一個全局事務(wù)。
    JDBC 方式由于其簡單性而具有吸引力,JTA 方式提供了更大的靈活性。您所選擇的實現(xiàn)將取決于應(yīng)用程序的特定需求。
    XADataSource例子:
    <?xml version="1.0" encoding="UTF-8"?>

    <!-- ===================================================================== -->
    <!--??? -->
    <!--? JBoss Server Configuration??? -->
    <!-- Thanks to Horia Muntean <horia@bvb.ro>?? -->
    <!-- ===================================================================== -->

    <!-- $Id: db2-xa-ds.xml,v 1.1.2.1 2003/05/30 18:25:57 d_jencks Exp $ -->


    <datasources>
    ?? <!--
    ?????? XADatasource for DB2 V8.1 (app driver)
    ?????? copy $db2_install_dir/java/db2java.zip into $jboss_install_dir/server/default/lib
    ?? -->

    ?? <xa-datasource>
    ???? <jndi-name>DB2XADS</jndi-name>
    ???? <xa-datasource-class>COM.ibm.db2.jdbc.DB2XADataSource</xa-datasource-class>
    ???? <xa-datasource-property name="DatabaseName">yout_database_name</xa-datasource-property>
    ???? <xa-datasource-property name="User">your_user</xa-datasource-property>
    ???? <xa-datasource-property name="Password">your_password</xa-datasource-property>
    ?? </xa-datasource>
    </datasources>

    引用:
    ?http://www.jspcn.net/htmlnews/11049371131251752.html
    http://www-128.ibm.com/developerworks/cn/java/j-dao/
    http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html

    posted on 2006-07-27 15:19 風(fēng)人園 閱讀(344) 評論(0)  編輯  收藏 所屬分類: J2EE

    主站蜘蛛池模板: 毛片免费全部播放无码| 亚洲最大无码中文字幕| 一道本在线免费视频| 日韩高清免费在线观看| 国产亚洲精aa在线看| 亚洲免费人成视频观看| 亚洲精品第一国产综合精品| 99热这里有免费国产精品| 亚洲另类激情综合偷自拍| 久久国产乱子伦精品免费一| 亚洲av无码一区二区乱子伦as| 一个人免费视频在线观看www| 国产亚洲AV无码AV男人的天堂 | 免费在线看片网站| 青青草国产免费国产是公开| 一本色道久久88综合亚洲精品高清| 国产亚洲Av综合人人澡精品| 亚洲国产a级视频| 天堂在线免费观看| 亚洲国产综合91精品麻豆| 青青青国产在线观看免费| 在线观看亚洲AV日韩A∨| 国产一级理论免费版| 2022免费国产精品福利在线| 香蕉视频在线观看亚洲| 精品国产免费人成电影在线观看| 最新亚洲春色Av无码专区| 成在线人永久免费视频播放| 久久久精品视频免费观看| 亚洲嫩模在线观看| 四虎影视大全免费入口| 少妇亚洲免费精品| 亚洲精品国产啊女成拍色拍| 成全视频免费高清| 精品免费久久久久国产一区| 亚洲综合日韩中文字幕v在线| 免费观看成人毛片a片2008| 人妻无码中文字幕免费视频蜜桃| 亚洲成年轻人电影网站www| 成人超污免费网站在线看| 国产黄在线观看免费观看不卡|