`
tanlan
  • 浏览: 202107 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用jotm实现跨数据库事务控制

阅读更多

测试环境:mysql-5.5.14,Oracle 10g Express,ow2-jotm-dist-2.1.9,JDK7,Win7

1,背景说明:两个数据库中分别有一张用户表,表结构设计类似,如下:
MySQL中:
CREATE TABLE TUSER
(
  id INT,
  name  VARCHAR(10) NOT NULL,
  PRIMARY KEY (id)
)
 Oracle中:
create table TUSER
(
  id    int primary key,
  name  VARCHAR2(10 CHAR) not null
)
 系统要求同时保存用户信息到这两个数据库中的用户表中。
2,新建Java Project,将两个数据库的驱动以及jotm中lib目录下的相关jar文件加入buildpath中
3,编写实体类
package com.tanlan.jta.entity;
public class User {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
4,编写DAO
package com.tanlan.jta.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.tanlan.jta.entity.User;
public class UserDAO {
	/**
	 * 增加用户信息到MySQL数据库中
	 * 
	 * @param user
	 * @param connection
	 * @throws SQLException
	 */
	public void addUserToMySQL(User user, Connection connection)
			throws SQLException {
		String sql = "insert into TUser values(?,?)";
		PreparedStatement pstmt = connection.prepareStatement(sql);
		pstmt.setInt(1, user.getId());
		pstmt.setString(2, user.getName());
		pstmt.execute();
	}

	/**
	 * 增加用户信息到Oracle数据库中
	 * 
	 * @param user
	 * @param connection
	 * @throws SQLException
	 */
	public void addUserToOracle(User user, Connection connection)
			throws SQLException {
		String sql = "insert into TUser values(?,?)";
		PreparedStatement pstmt = connection.prepareStatement(sql);
		pstmt.setInt(1, user.getId());
		pstmt.setString(2, user.getName());
		pstmt.execute();
	}
}
 
5,编写帮助类,实现启动与停止事务管理服务,以及取得数据库连接:
package com.tanlan.jta.dao;
import java.sql.Connection;
import javax.naming.NamingException;
import javax.sql.XAConnection;
import javax.transaction.UserTransaction;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.objectweb.jotm.Jotm;
import org.objectweb.transaction.jta.TMService;
public class JotmHelper {
	private TMService jotm;
	private UserTransaction userTransaction;
	/**
	 * 启动事务管理服务
	 */
	public void startTMService() {
		try {
			jotm = new Jotm(true, false);
			userTransaction = jotm.getUserTransaction();
		} catch (NamingException e1) {
			e1.printStackTrace();
		}
	}

	/**
	 * 取得数据库连接
	 * 
	 * @param db
	 * @return
	 * @throws Exception
	 */
	public Connection getConnection(String db) throws Exception {
		StandardXADataSource xads = new StandardXADataSource();
		XAConnection xaconn = null;
		if ("mysql".equals(db)) {
			xads.setDriverName("com.mysql.jdbc.Driver");
			xads.setUrl("jdbc:mysql://localhost/test");
			xads.setTransactionManager(jotm.getTransactionManager());
			xaconn = xads.getXAConnection("root", "root");
		} else if ("oracle".equals(db)) {
			xads.setDriverName("oracle.jdbc.driver.OracleDriver");
			xads.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
			xads.setTransactionManager(jotm.getTransactionManager());
			xaconn = xads.getXAConnection("tanlan", "tanlan");
		} else {

		}
		return xaconn.getConnection();
	}
	public void begin() {
		try {
			userTransaction.begin();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void commit() {
		try {
			userTransaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void rollback() {
		try {
			userTransaction.rollback();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 停止事务管理服务
	 */
	public void stopTMService() {
		jotm.stop();
		jotm = null;
	}
}
 6,测试代码
package com.tanlan.jta.test;
import java.sql.Connection;
import com.tanlan.jta.dao.JotmHelper;
import com.tanlan.jta.dao.UserDAO;
import com.tanlan.jta.entity.User;
public class TestUSer {
	public static void main(String[] args) {
		User user=new User();
		user.setId(300);
		user.setName("a122456");
		UserDAO dao = new UserDAO();
		JotmHelper helper = new JotmHelper();
		try {
			helper.startTMService();
			Connection mysqlConn = helper.getConnection("mysql");
			Connection oracleConn = helper.getConnection("oracle");
			helper.begin();
			dao.addUserToMySQL(user, mysqlConn);
			dao.addUserToOracle(user, oracleConn);
			helper.commit();
		} catch (Exception e) {
			helper.rollback();
			e.printStackTrace();
		} finally {
			helper.stopTMService();
		}
	}
}
 经过测试,这种方法能够较好的控制对两个数据库操作数据的事务。

1
1
分享到:
评论
1 楼 heipacker 2014-03-31  
确定测试过?

相关推荐

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    在Spring中使用JTA事务管理

    1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM 1.5. 在Spring中运行测试 2 ...

    jta分布式事务完成例子,测试通过

    例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...

    test-transactions:关于 JOTM 事务的 Grails 教程

    这就是正在实现的目标,目前我还没有将它分布在多个数据库上,并且只使用内部数据库作为测试的一部分:(下次有时间时将结合使用 mysql)Java:模型/Grails:域类: 在这方面,域类不是 Grails 的要求。 转换为...

    Java版水果管理系统源码-RTranscation:采用XA、TCC等处理分布式事务

    Atomikos,JOTM 等框架 实现了 TCC 协议的框架有 Sharding、EasyTransaction、tcc-transaction 等框架 对于 XA 协议来说,它使用的是 2PC 协议的方式,是阻塞式的,并且它还依赖于数据库自身提供的 XA 接口的可靠性...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包7

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包9

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java开源包101

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Java资源包01

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics