分布式事务jta简单入门

配置文件:

DriverClass = com.mysql.jdbc.Driver
JdbcUrl = jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8
User = root
Password = 123456
MaxPoolSize = 20
MinPoolSize = 2
InitialPoolSize = 5
MaxStatements = 30      
MaxIdleTime =100


工程目录结构

package com.jta.c3p0;
import java.sql.Connection;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;
 

public class C3P0Mysql {
 
   private ComboPooledDataSource cpds;
   
   private static C3P0Mysql c3P0Properties;
   
   static{
      c3P0Properties = new C3P0Mysql();
   }
 
   public C3P0Mysql() {
      try {
         cpds = new ComboPooledDataSource();
         
         //加载配置文件
         Properties props = new Properties();
         props.load(C3P0Mysql.class.getClassLoader().getResourceAsStream("config.properties"));
         
         cpds.setDriverClass(props.getProperty("DriverClass"));
         cpds.setJdbcUrl(props.getProperty("JdbcUrl"));
         cpds.setUser(props.getProperty("User"));
         cpds.setPassword(props.getProperty("Password"));
         
         cpds.setMaxPoolSize(Integer.parseInt(props.getProperty("MaxPoolSize")));
         cpds.setMinPoolSize(Integer.parseInt(props.getProperty("MinPoolSize")));
         cpds.setInitialPoolSize(Integer.parseInt(props.getProperty("InitialPoolSize")));
         cpds.setMaxStatements(Integer.parseInt(props.getProperty("MaxStatements")));
         cpds.setMaxIdleTime(Integer.parseInt(props.getProperty("MaxIdleTime")));
         
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   
   public static C3P0Mysql getInstance(){
      return c3P0Properties;
   }
   
   public Connection getConnection(){
      Connection conn = null;
      try {
         conn = cpds.getConnection();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return conn;
   }
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      Connection connection = C3P0Mysql.c3P0Properties.getConnection();
      System.out.println("已经连接成功");
 
   }
 
}

 

package com.jta;

import com.jta.c3p0.C3P0Mysql;
import com.mchange.v2.c3p0.impl.C3P0PooledConnection;
import com.mchange.v2.c3p0.impl.NewProxyConnection;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;

import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class JTA_MySQL {

    public static void main(String[] args) {
        XADataSource xaDs1  = JTA_MySQL.getDataSource(
                "jdbc:mysql://localhost:3306/demo", "root",
                "123456");
        XAConnection xaCon1 = null;
        XAResource xaRes1 = null;
        Connection conn1 = null;
        Statement stmt1 = null;


        XADataSource xaDs2 = JTA_MySQL.getDataSource(
                "jdbc:mysql://127.0.0.1:3306/test", "root",
                "123456");
        XAConnection xaCon2 = null;
        XAResource xaRes2 = null;
        Connection conn2 = null;
        Statement stmt2 = null;

        int ret1 = 0;
        int ret2 = 0;
        Xid xid1 = new MyXid(100, new byte[] { 100 }, new byte[] { 0x02 });
        Xid xid2 = new MyXid(100, new byte[] { 0x01 }, new byte[] { 0x03 });
        try {
            xaCon1 = getXAConnetion(xaDs1);
            conn1 = getConnection(xaCon1);
            stmt1 = conn1.createStatement();
            xaRes1 = xaCon1.getXAResource();


            xaCon2 = getXAConnetion(xaDs2);
            conn2 = getConnection(xaCon2);
            stmt2 = conn2.createStatement();
            xaRes2 = xaCon2.getXAResource();

            xaRes1.start(xid1, XAResource.TMNOFLAGS);
            stmt1.execute("delete from person where id=1");
            xaRes1.end(xid1, XAResource.TMSUCCESS);

            xaRes2.start(xid2, XAResource.TMNOFLAGS);
            stmt2.execute("insert into person select 1, 'zhang'");
            xaRes2.end(xid2, XAResource.TMSUCCESS);

            ret1 = xaRes1.prepare(xid1);
            ret2 = xaRes2.prepare(xid2);

            if (XAResource.XA_OK == ret1 && XAResource.XA_OK == ret2) {
                xaRes1.commit(xid1, false);
                xaRes2.commit(xid2, false);
                System.out.println("提交分布式事务");
            }else{
                xaRes1.rollback(xid1);
                xaRes2.rollback(xid2);
                System.out.println("回退分布式事务");
            }

        }catch (Exception e){
            e.printStackTrace();
        }



    }

    private static Connection getConnection(XAConnection xaCon1) {
        Connection conn = null;
        try {
            conn = xaCon1.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    private static XAConnection getXAConnetion(XADataSource dataSource) {
        XAConnection XAConn = null;
        try {
            XAConn = dataSource.getXAConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return XAConn;
    }

    private static XADataSource getDataSource(String url, String user, String password) {

        MysqlXADataSource dataSource = new MysqlXADataSource();
        dataSource.setUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(password);
        return dataSource;


    }
}

 

 

package com.jta;

import javax.transaction.xa.Xid;

public class MyXid implements Xid {
    private int formatId;
    private byte[] globalTid;
    private byte[] branchQ;

    public MyXid(int formatId, byte[] globalTid, byte[] branchQ) {
        this.formatId = formatId;
        this.globalTid = globalTid;
        this.branchQ = branchQ;
    }

    @Override
    public int getFormatId() {
        return formatId;
    }

    @Override
    public byte[] getGlobalTransactionId() {
        return globalTid;
    }

    @Override
    public byte[] getBranchQualifier() {
        return branchQ;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中留言,我会及时回复的。 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/> <!-- JTA事务管理器 --> <bean id="myJtaManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="jotm"/> </property> </bean> <!-- 数据源A --> <bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> </property> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 数据源B --> <bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc2.driver}"/> <property name="url" value="${jdbc2.url}"/> </bean> </property> <property name="user" value="${jdbc2.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..servi1ce*..*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="myJtaManager"> <tx:attributes> <tx:method name="delete*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice ...... ...... ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值