JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。
测试使用的jdk中自带了javax.transaction和javax.transaction.xa
参考http://blog.csdn.net/turkeyzhou/archive/2008/10/13/3071683.aspx 该文章后自己修改的程序的测试
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
public class JTATest {
/**
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
XADataSource xaDs1=JTATest.getDataSource("jdbc:mysql://192.168.*.*:3306/mx2", "root", "root");
XAConnection xaCon1=null;
XAResource xaRes1 = null;
Connection conn1=null;
Statement stmt1 =null;
XADataSource xaDs2=JTATest.getDataSource("jdbc:mysql://192.168.*.*:3306/mx1", "root", "root");
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[]{0x01}, new byte[]{0x02});
Xid xid2=new MyXid(100, new byte[]{0x01}, new byte[]{0x03});
try {
xaCon1 = JTATest.getXAConnetion(xaDs1);
conn1= JTATest.getConnection(xaCon1);
stmt1=conn1.createStatement();
xaRes1=xaCon1.getXAResource();
xaCon2 = JTATest.getXAConnetion(xaDs2);
conn2= JTATest.getConnection(xaCon2);
stmt2=conn2.createStatement();
xaRes2=xaCon2.getXAResource();
xaRes1.start(xid1, XAResource.TMNOFLAGS);
stmt1.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (148,'aaabbb','"+dateFormat.format(new Date())+"')");
xaRes1.end(xid1, XAResource.TMSUCCESS);
if (xaRes2.isSameRM(xaRes1)) {
xaRes2.start(xid1, XAResource.TMNOFLAGS);
stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (148,'aaabbb','"+dateFormat.format(new Date())+"')");
xaRes2.end(xid1, XAResource.TMSUCCESS);
}else{
xaRes2.start(xid2, XAResource.TMNOFLAGS);
stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES ('148','aaabbb','"+dateFormat.format(new Date())+"')");
xaRes2.end(xid2, XAResource.TMSUCCESS);
ret1=xaRes2.prepare(xid2);
// if (ret==XAResource.XA_OK) {
// xaRes2.commit(xid2, false);
// }
}
ret2 = xaRes1.prepare(xid1);
if (ret1 == XAResource.XA_OK&&ret2==XAResource.XA_OK) {
//xaRes1.commit(xid1, false);
xaRes1.rollback(xid1);
if (xaRes2.isSameRM(xaRes1)) {
xaRes2.rollback(xid1);
}else{
xaRes2.rollback(xid2);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XAException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static XADataSource getDataSource(String url,String user,String password) {
// TODO Auto-generated method stub
MysqlXADataSource dataSource = new MysqlXADataSource();
dataSource.setUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
return dataSource;
}
public static XAConnection getXAConnetion(XADataSource dataSource) {
XAConnection XAConn = null;
try {
XAConn = dataSource.getXAConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return XAConn;
}
public static Connection getConnection(XAConnection XAConn) {
Connection conn = null;
try {
conn = XAConn.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeConnection(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("连接关闭失败");
}
}
}
这里测试的是 如果两个操作都成功了就回滚, 实现了这样的功能。不过运用到实际程序中还需要更改。
分享到:
相关推荐
JBPM需要一个持久化存储来保存工作流实例、任务、变量等信息,而MySQL是一个常用的数据库管理系统,适合这种需求。在配置JBPM与MySQL的连接时,你需要在jbpm-datasources.xml文件中设置数据源。确保以下几点: 1. *...
在描述中提到了`mysql-connector-java`,这意味着我们将使用MySQL数据库,并且其JDBC驱动支持JTA。 在实际操作中,一个简单的JTA示例可能如下: 1. 首先,通过`UserTransaction`开始一个事务。 2. 然后,获取到`XA...
通过XML配置文件或注解方式,我们可以声明组件间的依赖,Spring会自动进行实例化和装配。同时,Spring的AOP功能可以方便地实现切面逻辑,如事务管理。 二、Hibernate框架 Hibernate是一个流行的ORM工具,它允许...
本项目"jtademo"就是这样一个示例,它演示了如何利用Bitronix Transaction Manager (BTM)在两个MySQL数据源之间实现JTA事务。 1. **JTA简介** JTA是Java EE平台的一部分,提供了一种标准的方式来管理分布式事务。...
为了使用Hibernate连接到MySQL数据库,我们需要以下几类JAR包: 1. Hibernate核心库:这是Hibernate的基础,包含了ORM的主要功能,如实体管理、会话接口、查询语言等。文件名通常为`hibernate-core.jar`。 2. ...
为了存储jbpm运行所需的数据,你需要在MySQL数据库中创建一个名为jbpmdb的数据库,并运行jbpm.mysql.create.sql脚本来创建所需的表结构。此外,还需要创建一个表来存储业务数据,例如请假申请表(ask_for_leave),...
本Demo基于Hibernate5,结合MySQL数据库,提供了完整的源码实例,帮助开发者快速理解和应用Hibernate。以下将详细介绍Hibernate5和MySQL的集成过程以及核心概念。 1. **Hibernate5概述** Hibernate5是Hibernate ...
【Hibernate+Mysql】是一个经典的Java开发中的持久化框架与数据库结合的应用实例,主要涉及到的技术栈包括Maven作为项目构建工具,Hibernate作为对象关系映射(ORM)框架,以及MySQL作为常用的开源关系型数据库。...
还有XA以及两阶段提交,并通过实例演示了使用JTA,通过两阶段提交,实现多数据源的事务实现。... 4-1 Spring事务机制_基本接口 4-2 Spring事务机制_实现 4-3 Jpa事务实例 4-4 Jms事务原理 4-5 Jms-session事务实例 4...
6. **数据库集成**:通常,J2EE项目会涉及与关系型数据库如MySQL、Oracle的交互,使用JDBC或ORM框架如Hibernate进行数据访问。 7. **Web服务**:SOAP或RESTful风格的Web服务可以扩展J2EE应用,使其能够与其他系统...
- 数据库复制:可以使用MySQL的主从复制、双活或者基于中间件如GoldenGate、Maxwell等实现数据的实时同步。 - 异步任务:使用SpringTask或者消息队列如RabbitMQ、Kafka,将同步任务异步化,保证主业务的高并发性能...
首先,`mysql-ds.xml`文件通常用于配置数据源,这表明我们的应用将使用MySQL 5.x作为后端数据库。在Java EE应用中,数据源配置通常在`context.xml`或`web.xml`中,通过JNDI(Java Naming and Directory Interface)...
- **事务管理**: 支持JTA和JDBC事务管理。 ### 2. Hibernate 配置 在开始使用Hibernate之前,我们需要配置`hibernate.cfg.xml`文件。这个文件包含了数据库连接信息、方言设置、缓存配置等关键信息。例如: ```xml...
在本实例中,我们将使用MyEclipse6.0作为集成开发环境,以及JBoss3.2.1作为应用服务器来创建一个基本的EJB3入门项目。 **1. 开发环境准备** 首先,确保安装了JDK 1.5或更高版本,因为EJB3需要Java 5以上的支持。在...
Hibernate支持多种数据库,包括MySQL、Oracle、PostgreSQL等,并提供了丰富的API和查询语言HQL(Hibernate Query Language)。 **2. Hibernate配置** 在开始hibernate实例之前,我们需要进行一些基本的配置。这通常...
这份文档将结合实例,深入浅出地解释这些概念,帮助读者快速掌握MySQL和JavaEE的核心技能。无论是初学者还是有经验的开发者,都能从中受益,提升自己的技术水平。通过API说明文档,你将能更好地理解和应用这些技术,...
标题中的“5.0javaEE_原生Servlet_MySql塞北村镇旅游网站设计”表明这是一个基于Java EE技术栈,使用原始Servlet实现的Web应用程序,主要用于塞北村镇的旅游信息发布和管理。该程序可能集成了MySQL数据库来存储旅游...
在《Java 集成开发实例精解》中,我们主要探讨的是如何使用Java语言进行高效、稳定且灵活的集成开发。这本书的核心是通过具体的实例来解析Java在实际项目中的应用,帮助开发者深入理解Java集成开发的关键技术和最佳...
Atomikos作为JTA(Java Transaction API)的实现,可以与Spring的声明式事务管理相结合,提供分布式事务的解决方案。 Mybatis是一款轻量级的持久层框架,它简化了SQL与Java对象之间的映射过程。Mybatis并不直接支持...
### 利用Myeclipse 6与JBoss开发EJB3入门实例详解 #### 一、概述 本文将详细介绍如何使用Myeclipse 6和JBoss来开发一个EJB3入门级的应用程序。通过本教程,您将学习到EJB3的基本概念、所需开发工具的配置、以及...