测试环境: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();
}
}
}
经过测试,这种方法能够较好的控制对两个数据库操作数据的事务。
分享到:
相关推荐
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM 1.5. 在Spring中运行测试 2 ...
例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...
这就是正在实现的目标,目前我还没有将它分布在多个数据库上,并且只使用内部数据库作为测试的一部分:(下次有时间时将结合使用 mysql)Java:模型/Grails:域类: 在这方面,域类不是 Grails 的要求。 转换为...
Atomikos,JOTM 等框架 实现了 TCC 协议的框架有 Sharding、EasyTransaction、tcc-transaction 等框架 对于 XA 协议来说,它使用的是 2PC 协议的方式,是阻塞式的,并且它还依赖于数据库自身提供的 XA 接口的可靠性...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...