- 浏览: 280016 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
用JDBC连接Postgres(Postgres学习笔记1) -
cuiran:
不错,讲的很详细。
web.xml 中的listener、 filter、servlet 加载顺序及其详解 -
i_am_birdman:
PostgreSQL的管理启动服务pg_ctl -D /pat ...
PostgreSql 数据库备份恢复 删除 建立 -
i_am_birdman:
songshuang 写道现在觉悟也不晚!加油!
加油呵呵
人生规划啊 -
songshuang:
现在觉悟也不晚!加油!
人生规划啊
jta
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。
要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如:
utx.begin();
// ...
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();
让我们来关注下面的话:
“用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection
和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个
XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC
连接。”
要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。
XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。
Note:
Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。
My SQL 连本地都支持不好,更别说分布事务了。
MySql 在5.0的版本后增加了对xa的支持
JTA方式的实现过程:
用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中
进行管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚
了,别的都是黑箱操作。
在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。
下面的例子说明Xid的实现:
import javax.transaction.xa.*;
public class MyXid implements Xid
{
protected int formatId;
protected byte gtrid[];
protected byte bqual[];
public MyXid()
{
}
public MyXid(int formatId, byte gtrid[], byte bqual[])
{
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}
public int getFormatId()
{
return formatId;
}
public byte[] getBranchQualifier()
{
return bqual;
}
public byte[] getGlobalTransactionId()
{
return gtrid;
}
}
其次,你需要创建一个你要使用的数据库的数据源:
public DataSource getDataSource()
throws SQLException
{
SQLServerDataSource xaDS = new
com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
xaDS.setDataSourceName("SQLServer");
xaDS.setServerName("server");
xaDS.setPortNumber(1433);
xaDS.setSelectMethod("cursor");
return xaDS;
}
例1?这个例子是用“两步提交协议”来提交一个事务分支:
XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[], new byte[]);
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}
当然,实际过程中,我们不需要写这些代码,这些代码是JTA最终的实现代码。
关于“两步提交协议”,可以参看下面的文章:
http://www.jspcn.net/htmlnews/11049371131251752.html
http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html
选择最好的方式
用 JDBC API 进事务界定来构建 DAO 类的。这些 DAO 类可以总结如下:
事务界定代码嵌入在 DAO 类中。
DAO 类使用 JDBC API 进行事务界定。
调用者不能界定事务。
事务范围局限于单个 JDBC 连接。
JDBC 事务并不总是适合复杂的企业应用程序。如果您的事务要跨越多个 DAO 或者多个数据库,那么下列实现策略也许更合适:
事务用 JTA 界定。
事务界定代码从 DAO 中分离出来。
调用者负责界定事务。
DAO 加入一个全局事务。
JDBC 方式由于其简单性而具有吸引力,JTA 方式提供了更大的灵活性。您所选择的实现将取决于应用程序的特定需求。
XADataSource例子:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- Thanks to Horia Muntean <horia@bvb.ro> -->
<!-- ===================================================================== -->
<!-- $Id: db2-xa-ds.xml,v 1.1.2.1 2003/05/30 18:25:57 d_jencks Exp $ -->
<datasources>
<!--
XADatasource for DB2 V8.1 (app driver)
copy $db2_install_dir/java/db2java.zip into $jboss_install_dir/server/default/lib
-->
<xa-datasource>
<jndi-name>DB2XADS</jndi-name>
<xa-datasource-class>COM.ibm.db2.jdbc.DB2XADataSource</xa-datasource-class>
<xa-datasource-property name="DatabaseName">yout_database_name</xa-datasource-property>
<xa-datasource-property name="User">your_user</xa-datasource-property>
<xa-datasource-property name="Password">your_password</xa-datasource-property>
</xa-datasource>
</datasources>
发表评论
-
JSTL
2015-03-18 10:01 0<td width="20%" al ... -
struts-bean.tld,struts-html.tld,struts-logic.tld 这几个东西是干什么用的?
2013-08-02 10:51 866struts-html标签库。这个库可以被用来生成动态HTML ... -
2011_11_14(svn提交失败,唯一约束)
2011-11-14 16:43 11121) ALTER TABLE stat.stat ... -
开发中备忘
2011-08-02 15:50 828之前版本用数组处理,现在为了赶进度,仍然用list转换为数组传 ... -
xml文档
2011-07-31 11:51 622用dom4j处理时,当一个节点是空时,显示为<***** ... -
《重构》读书笔记
2011-07-24 16:01 827如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便 ... -
state模式
2011-06-20 21:02 781待续。。。。。 -
javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
2011-06-19 21:12 4118问题: HTTP ERROR 500 Problem ac ... -
Deployment failure on Tomcat 6.x. Could not copy all resources to
2011-06-19 10:15 1213Deployment failure on Tomcat 6. ... -
Resin Configuration summary:And Resin make install 's output
2011-05-09 16:08 1236./configure --prefix=/usr/l ... -
最近松懈了。。。
2011-05-04 22:53 691最近因为没什么活,整个人一下松懈了,不应该放这么多的时间在没用 ... -
最近两天总结
2011-03-18 23:14 9341.openOffice,一个挺牛逼的软件,不过现在是orac ... -
关于最近项目生活的体会
2011-03-14 18:58 8331.学习了聚合函数array_accum的运用,http:// ... -
junit 4 中的Before After Ignore Test BeforeClass AfterClass
2011-01-21 20:26 1623JUnit 4 使用 Java 5 中的注解(annota ... -
Junit 4
2011-01-11 18:57 1150近期写单元测试计划,公司准备把junit3.8升级到jun ... -
HIBERNATE 文档
2010-12-14 10:48 972找了一些关于Hibernate的资料,发现还是官网的最好... ... -
FCKEditor: Remove & prevent <p> tags from wrapping your content
2010-12-11 17:25 1098For some reason, FCKEditor ... -
difference between request.getParameter() and request.getAttribute()
2010-12-08 13:50 843What is the difference between ... -
session详解 -转(作者:郎云鹏)
2010-12-07 13:42 915目录: 一、术语sess ... -
获得网页来访者IP;操作系统版本;浏览器版本
2010-12-05 14:34 3707一,获得网页来访者IP ...
相关推荐
本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的事务一致性。 首先,让我们了解JTA的基本概念。JTA是一个规范,它定义了接口和API,使得应用程序可以控制跨越多个数据存储(如数据库、...
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。 要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。
**JTA事务**则适用于分布式环境,可以跨越多个数据源管理事务。JTA通过`UserTransaction`接口提供事务控制,支持两阶段提交(2PC)协议。在2PC中,事务处理监视器(TPM)先询问所有资源管理器(如数据库)是否准备好...
但在迁移到基于Mina框架的API时,Resin不再作为依赖,因此需要寻找新的JTA事务管理工具。在这个过程中,Atomikos 2.Api被选中作为替代方案。然而,一个主要的问题出现了:Atomikos的数据库连接配置缺少类似于`...
本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM(Java Open Transaction Manager)以及引用Tomcat的JTA事务。 ### 1. 通过集成JOTM,直接在Spring中使用JTA事务 #### 1.1. 添加JOTM类库到类路径...
在tomcat 中配置JTA 事务,方便管理web项目
"Jboss4.2.2+Spring2.5.6+Hibernate+JTA事务的实现"就是一个典型的例子,它涉及到四个关键的技术栈,即JBoss Application Server 4.2.2、Spring 2.5.6、Hibernate ORM以及Java Transaction API(JTA)。这些技术的...
标题"spring+jms+jta事务的消息发送和消息消费"指的是一种利用Spring框架集成JMS进行消息传递,并通过JTA来管理分布式事务的场景。这样的设计允许应用程序在多组件环境中保证数据的一致性,即使在组件之间存在网络...
标题中的“Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理”揭示了一个集成开发环境,用于构建分布式、事务一致性的Java应用程序。这个组合利用了Spring框架的依赖注入和AOP(面向切面...
- 使用`@EnableJtaTransactionManagement`注解开启JTA事务管理。 5. **编写代码**: - 在需要进行多数据源事务操作的服务类上,使用`@Transactional`注解声明事务边界。 - 在事务方法内部,根据业务逻辑切换数据...
1. **配置数据源**:为每个数据库创建独立的数据源,并确保它们支持JTA事务。 2. **注册XAResource**:将每个数据源作为XAResource注册到事务协调器。 3. **开始事务**:通过UT接口启动一个新的全局事务。 4. **执行...
使用JTA事务可以确保分布式事务的一致性和可靠性,例如,在一个分布式事务中,如果某个资源管理器执行失败,可以使用rollback()方法来回滚事务,以确保分布式事务的一致性。 JTA事务工作流程 JTA事务工作流程可以...
Spring Boot支持JTA事务管理,主要通过以下组件实现: 1. Atomikos:这是一个开源的JTA实现,提供了一种在Spring Boot中实现分布式事务的方式。 2. Bitronix:另一种JTA实现,也可以与Spring Boot集成,处理分布式...
XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。 JTA事务比JDBC事务更强大。一个JTA事务...
Mybatis则是一个轻量级的持久层框架,它简化了SQL操作,但在JTA事务中,Mybatis需要配合Spring的TransactionManager来工作,使得每个数据库操作都在同一个事务上下文中。 实现步骤如下: 1. 添加依赖:在Spring ...
Atomikos是一个开源的JTA事务管理器,它提供了对分布式事务的支持。在分布式系统中,由于多个资源(如数据库、消息队列等)需要进行原子操作,因此需要一个事务管理器来协调这些操作,确保事务的ACID特性(原子性、...
JTA(Java Transaction API)是Java平台上的一个标准接口,用于处理分布式事务,它允许应用程序在不同的数据源之间进行协调,确保事务的ACID特性(原子性、一致性、隔离性和持久性)。本示例代码旨在展示如何在Java...