聽涓鑸儏鍐典笅錛孞2EE搴旂敤鏈嶅姟鍣ㄦ敮鎸丣DBC浜嬪姟銆丣TA浜嬪姟銆佸鍣ㄧ鐞嗕簨鍔°傝繖閲岃璁篔TA鍜孞DBC浜嬪姟鐨勫尯鍒傝繖2涓槸甯哥敤鐨凞AO妯″紡浜嬪姟鐣屽畾鏂瑰紡銆?br />JDBC 浜嬪姟
聽JDBC 浜嬪姟鏄敤 Connection 瀵硅薄鎺у埗鐨勩侸DBC Connection 鎺ュ彛( java.sql.Connection )鎻愪緵浜嗕袱縐嶄簨鍔℃ā寮忥細鑷姩鎻愪氦鍜屾墜宸ユ彁浜ゃ備緥濡傚涓嬬墖鏂細
聽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 浜嬪姟鐨勪竴涓己鐐規槸浜嬪姟鐨勮寖鍥村眬闄愪簬涓涓暟鎹簱榪炴帴銆備竴涓?JDBC 浜嬪姟涓嶈兘璺ㄨ秺澶氫釜鏁版嵁搴撱?br />JTA浜嬪姟
聽JTA(Java Transaction API) 涓?J2EE 騫沖彴鎻愪緵浜嗗垎甯冨紡浜嬪姟鏈嶅姟銆?br />聽瑕佺敤 JTA 榪涜浜嬪姟鐣屽畾錛屽簲鐢ㄧ▼搴忚璋冪敤 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();
聽璁╂垜浠潵鍏蟲敞涓嬮潰鐨勮瘽錛?br />聽鈥滅敤 JTA 鐣屽畾浜嬪姟錛岄偅涔堝氨闇瑕佹湁涓涓疄鐜?javax.sql.XADataSource 銆?javax.sql.XAConnection 鍜?javax.sql.XAResource 鎺ュ彛鐨?JDBC 椹卞姩紼嬪簭銆備竴涓疄鐜頒簡榪欎簺鎺ュ彛鐨勯┍鍔ㄧ▼搴忓皢鍙互鍙備笌 JTA 浜嬪姟銆備竴涓?XADataSource 瀵硅薄灝辨槸涓涓?XAConnection 瀵硅薄鐨勫伐鍘傘?XAConnection s 鏄弬涓?JTA 浜嬪姟鐨?JDBC 榪炴帴銆傗?br />聽瑕佷嬌鐢↗TA浜嬪姟錛屽繀欏諱嬌鐢╔ADataSource鏉ヤ駭鐢熸暟鎹簱榪炴帴錛屼駭鐢熺殑榪炴帴涓轟竴涓猉A榪炴帴銆?br />聽XA榪炴帴錛坖avax.sql.XAConnection錛夊拰闈瀀A錛坖ava.sql.Connection錛夎繛鎺ョ殑鍖哄埆鍦ㄤ簬錛歑A鍙互鍙備笌JTA鐨勪簨鍔★紝鑰屼笖涓嶆敮鎸佽嚜鍔ㄦ彁浜ゃ?br />聽聽聽聽 Note:
Oracle, Sybase, DB2, SQL Server絳夊ぇ鍨嬫暟鎹簱鎵嶆敮鎸乆A, 鏀寔鍒嗗竷浜嬪姟銆?
My SQL 榪炴湰鍦伴兘鏀寔涓嶅ソ錛屾洿鍒鍒嗗竷浜嬪姟浜嗐?br />JTA鏂瑰紡鐨勫疄鐜拌繃紼?/font>錛?br />聽聽 鐢╔ADataSource浜х敓鐨刋AConnection瀹冩墿灞曚簡涓涓猤etXAResource()鏂規硶,浜嬪姟閫氳繃榪欎釜鏂規硶鎶婂畠鍔犲叆鍒頒簨鍔″鍣ㄤ腑榪涜綆$悊.瀵逛簬璋冪敤鑰呮潵璇?鏍規湰鐪嬩笉鍒頒簨鍔℃槸濡傛灉綆$悊鐨?浣犲彧瑕佸0鏄庡紑濮嬩簨鍔?鍛婅瘔瀹瑰櫒鎴戜笅闈㈢殑鎿嶄綔瑕佹眰浜嬪姟鍙備笌浜?鏈鍚庡憡璇変簨鍔¤鍒拌繖鍎垮彲浠ユ彁浜ゆ垨鍥炴粴浜?鍒殑閮芥槸榛戠鎿嶄綔銆?br />聽鍦ㄤ嬌鐢↗TA涔嬪墠錛屼綘蹇呴』棣栧厛瀹炵幇涓涓猉id綾葷敤鏉ユ爣璇嗕簨鍔★紙鍦ㄦ櫘閫氭儏鍐典笅榪欏皢鐢變簨鍔$鐞嗙▼搴忔潵澶勭悊錛夈俋id鍖呭惈涓変釜鍏冪礌錛歠ormatID銆乬trid錛堝叏灞浜嬪姟鏍囪瘑絎︼級鍜宐qual錛堝垎鏀慨楗拌瘝鏍囪瘑絎︼級銆?br />聽涓嬮潰鐨勪緥瀛愯鏄嶺id鐨勫疄鐜幫細
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;
銆}
}
聽鍏舵錛屼綘闇瑕佸垱寤轟竴涓綘瑕佷嬌鐢ㄧ殑鏁版嵁搴撶殑鏁版嵁婧愶細
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;
}
銆銆渚??榪欎釜渚嬪瓙鏄敤鈥滀袱姝ユ彁浜ゅ崗璁濇潵鎻愪氦涓涓簨鍔″垎鏀細
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();
}
聽褰撶劧錛屽疄闄呰繃紼嬩腑錛屾垜浠笉闇瑕佸啓榪欎簺浠g爜錛岃繖浜涗唬鐮佹槸JTA鏈緇堢殑瀹炵幇浠g爜銆?br />鍏充簬鈥滀袱姝ユ彁浜ゅ崗璁濓紝鍙互鍙傜湅涓嬮潰鐨勬枃绔狅細
http://www.jspcn.net/htmlnews/11049371131251752.html
聽http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html
閫夋嫨鏈濂界殑鏂瑰紡
鐢?JDBC API 榪涗簨鍔$晫瀹氭潵鏋勫緩 DAO 綾葷殑銆傝繖浜?DAO 綾誨彲浠ユ葷粨濡備笅錛?/p>
浜嬪姟鐣屽畾浠g爜宓屽叆鍦?DAO 綾諱腑銆?
DAO 綾諱嬌鐢?JDBC API 榪涜浜嬪姟鐣屽畾銆?
璋冪敤鑰呬笉鑳界晫瀹氫簨鍔°?
浜嬪姟鑼冨洿灞闄愪簬鍗曚釜 JDBC 榪炴帴銆?
JDBC 浜嬪姟騫朵笉鎬繪槸閫傚悎澶嶆潅鐨勪紒涓氬簲鐢ㄧ▼搴忋傚鏋滄偍鐨勪簨鍔¤璺ㄨ秺澶氫釜 DAO 鎴栬呭涓暟鎹簱錛岄偅涔堜笅鍒楀疄鐜扮瓥鐣ヤ篃璁告洿鍚堥傦細
浜嬪姟鐢?JTA 鐣屽畾銆?
浜嬪姟鐣屽畾浠g爜浠?DAO 涓垎紱誨嚭鏉ャ?
璋冪敤鑰呰礋璐g晫瀹氫簨鍔°?
DAO 鍔犲叆涓涓叏灞浜嬪姟銆?
JDBC 鏂瑰紡鐢變簬鍏剁畝鍗曟ц屽叿鏈夊惛寮曞姏錛孞TA銆鏂瑰紡鎻愪緵浜嗘洿澶х殑鐏墊椿鎬с傛偍鎵閫夋嫨鐨勫疄鐜板皢鍙栧喅浜庡簲鐢ㄧ▼搴忕殑鐗瑰畾闇姹傘?br />XADataSource渚嬪瓙錛?br /><?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>
寮曠敤錛?br />聽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