分布式事务JOTM纯Java代码示例

1、代码分析

纯java不用spring等框架,代码如下

package com.wenc.jdbc;

import org.enhydra.jdbc.standard.StandardXADataSource;
import org.objectweb.jotm.Jotm;

import javax.naming.Context;
import javax.sql.XAConnection;
import javax.transaction.Status;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class JOTMTest {

    public static String getStatusName(int status) {
        String statusName = null;
        try {
            Field[] flds = Status.class.getDeclaredFields();
            for (int i = 0; i < flds.length; i++) {
                if (flds[i].getInt(null) == status) {
                    statusName = flds[i].getName();
                    break;
                }
            }
        } catch (Exception e) {
            statusName = "invalid status value!";
        }
        return statusName;
    }
    
    public static Connection getConnection(TransactionManager tm, String driverName, String dbUrl, String u, String p) throws SQLException {
        StandardXADataSource standardXADataSource = new StandardXADataSource();
        standardXADataSource.setDriverName(driverName);
        standardXADataSource.setUrl(dbUrl);
        standardXADataSource.setTransactionManager(tm);
        XAConnection xaconn = standardXADataSource.getXAConnection(u, p);
        return xaconn.getConnection();
    }

    public static void main(String[] a) throws Exception {
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.ow2.carol.jndi.spi.MultiOrbInitialContextFactory");
        //System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");

        Jotm jotm = new Jotm(true, false);
        UserTransaction utx = jotm.getUserTransaction();

        System.out.println(getStatusName(utx.getStatus()));
        utx.begin();
        System.out.println(getStatusName(utx.getStatus()));
        try {
            Connection conn = getConnection(jotm.getTransactionManager(), "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1/jdbc", "root", "");
            Statement statement = conn.createStatement();
            statement.execute("insert into class(class_id, name) values('2012', 'jotm1')");
            
            Connection conn2 = getConnection(jotm.getTransactionManager(), "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1/jdbc2", "root", "");
            statement = conn2.createStatement();
            statement.execute("insert into class(class_id, name) values('2011', 'jotm1')");
        
            utx.commit();
            System.out.println("分布式事务成功");
            
        } catch (Exception e) {
        	System.out.println("分布式事务失败:" + e);
        	utx.rollback();
        }
      
        System.out.println(getStatusName(utx.getStatus()));

        jotm.stop();
    }
}


输出

九月 19, 2017 8:53:26 下午 org.objectweb.jotm <init>
信息: JOTM started with a local transaction factory which is not bound.
九月 19, 2017 8:53:26 下午 org.objectweb.jotm <init>
信息: CAROL initialization
STATUS_NO_TRANSACTION
STATUS_ACTIVE
分布式事务失败:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2011' for key 'class_id_UNIQUE'
STATUS_NO_TRANSACTION
九月 19, 2017 8:53:26 下午 org.objectweb.jotm stop
信息: stop JOTM

因jdbc2库class表已存在唯一键2011,jdbc\jdbc2数据库均未插入代码中的两条数据。

2、依赖jar包

.classpath内容:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_144"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/JUnit4/junit-4.11.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/hamcrest-core_jb51/hamcrest-core-1.3.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44-bin.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/jta-1.3.1.jar/jta-1.3.1.jar" sourcepath="D:/搜狗高速下载/jta-1.3.1.jar/jta-1.3.1.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/jotm.jar/jotm.jar" sourcepath="D:/搜狗高速下载/jotm.jar/jotm.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/xapool-1.5.0.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/jotm-carol.jar/jotm-carol.jar" sourcepath="D:/搜狗高速下载/jotm-carol.jar/jotm-carol.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/commons-logging-1.2-bin/commons-logging-1.2/commons-logging-1.2.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/jotm-core.jar"/>
	<classpathentry kind="lib" path="D:/搜狗高速下载/javax.resource.jar/javax.resource.jar"/>
	<classpathentry kind="output" path="bin"/>
</classpath>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值