概述
Java事务API(JTA;Java Transaction API)和它的同胞Java事务服务(JTS;Java Transaction Service),为J2EE平台提供了分布式事务服务。一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个
资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。下图显示了事务管理器和资源管理的间的关系。 JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个
Java平台的组件都可以参与到一个JTA事务中: .JDBC连接 .JDO PersistenceManager 对象 .JMS 队列 .JMS 主题 .企业JavaBeans(EJB) .一个用J2EE Connector Architecture 规范编译的资源分配器。
使用JTA的事务划分
要用JTA来划分一个事务,
应用程序调用javax.transaction.UserTransaction接口中的方法。示例4显示了一个典型的JNDI搜索的UseTransaction对象。
import javax.transaction.*;
import javax.naming.*;
// ...
InitialContext ctx = new InitialContext();
Object txObj = ctx.lookup(";java:comp/UserTransaction";);
UserTransaction utx = (UserTransaction) txObj;
应用程序有了UserTransaction对象的引用之后,就可以象示例5那样来起动事务。
utx.begin();
// ...
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement(";UPDATE MOVIES ...";);
pstmt.setString(1, ";Spinal Tap";);
pstmt.executeUpdate();
// ...
utx.commit();
// ...
当应用程序调用commit()时,事务管理器使用两段提交协议来结束事务。JTA事务控制的方法: .javax.transaction.UserTransaction接口提供
使用JTA和JDBC
应用程序调用begin()来起动事务,即可调用commit()也可以调用rollback()来结束事务。 开发人员经常使用JDBC来作为DAO类中的底层数据操作。如果计划使用JTA来划分事务,你将需要一个实现了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驱动。实现了这些接口的驱动将有能力参与到JTA事务中。一个XADataSource对象是一个XAConnection对象的工厂。XAConnections是参与到JTA事务中的连接。 你需要使用应用程序服务器
管理工具来建立XADataSource对象。对于特殊的指令请参考应用程序服务器文档和JDBC驱动文档。 J2EE应用程序使用JNDI来查找数据源。一旦应用程序有了一个数据源对象的引用,这会调用javax.sql.DataSource.getConnection()来获得数据库的连接。 XA连接区别于非XA连接。要记住的是XA连接是一个JTA事务中的参与者。这就意味着XA连接不支持JDBC的自动提交特性。也就是说应用程序不必在XA连接上调用java.sql.Connection.commit()或java.sql.Connection.rollback()。相反,应用程序应该使用UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback().
选择最好的方法 我们已经讨论了JDBC和JTA是怎样划分事务的。每一种方法都有它的优点,因此你需要决定为你的应用程序选择一个最适应的方法。 在我们团队许多最近的对于事务划分的项目中使用JDBC API来创建DAO类。这DAO类总结如下: .事务划分代码被嵌入到DAO类内部 .DAO类使用JDBC API来进行事务划分 .调用者没有划分事务的方法 .事务范围被限定在一个单一的JDBC连接 JDBC事务对复杂的企业应用程序不总是有效的。如果你的事务将跨越多个DAO对象或多个数据库,那么下面的实现策略可能会更恰当: .用JTA对事务进行划分 .事务划分代码被DAO分开 .调用者承担划分事务的责任 .DAO参与一个全局的事务中 JDBC方法由于它的简易性而具有吸引力,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>
相关推荐
Java 企业版(Java 2 Platform, Enterprise Edition,简称 J2EE)是 Sun Microsystems 推出的用于构建分布式、多层企业级应用的框架。它为开发者提供了多种服务和组件模型,包括Java Servlets、JavaServer Pages ...
6. **JTA(Java Transaction API)**:用于管理分布式事务,确保在多个操作之间的一致性和原子性。 7. **JPA(Java Persistence API)**:提供了一种规范来处理Java对象和数据库之间的持久化,取代了传统的EJB CMP...
J2EE 1.5中的JTA 1.1规范支持全局事务,可以跨多个数据库或EJB组件进行协调。 7. **JAF(JavaBeans Activation Framework)**: JAF为处理MIME类型的对象提供了统一的框架,常用于电子邮件和Web服务。在J2EE 1.5中...
本试题集涵盖了J2EE的关键知识点,包括但不限于Servlet、JSP、EJB、JNDI、JMS、JTA、JDBC以及MVC设计模式等。以下是对这些主题的详细解释: 1. **Servlet**:Servlet是Java编写的服务器端程序,主要功能是接收并...
J2EE(Java 2 Platform, Enterprise Edition)是一个用于构建企业级分布式应用程序的平台,它提供了丰富的服务和组件模型,包括Web应用、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java ...
J2EE在早期版本中主要包含了Web组件、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等核心技术。 **一、J2EE架构** J2EE架构基于分层模型,通常包括以下层次: 1. **...
该文档可能包含了J2EE各个组件和接口的详细说明,包括Servlet、JSP、EJB、JMS、JNDI、JTA等关键部分。 1. **Servlet**:Servlet是Java编程语言中的一个接口,用于扩展服务器的功能。它允许开发人员创建动态响应HTTP...
**J2EE面试题集锦(附答案)** 在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)作为企业级应用开发的基石,一直备受关注。掌握J2EE技术是许多Java开发者职业生涯中的重要一步,而面试则是检验开发者技能的...
J2EE作为一个企业级的应用开发平台,它提供了丰富的组件和服务,如Servlet、JSP、EJB、JMS、JTA、JPA等,用于构建分布式、多层的复杂应用程序。 1. **Servlet与JSP**:Servlet是J2EE中的基础组件,负责处理HTTP请求...
它提供了一整套规范和服务,包括Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等,旨在简化企业级开发并提高系统的可移植性。 **第一章:J2EE概述** ...
6. **Java Transaction API (JTA) 1.1**: JTA提供了跨多个资源的事务管理能力,确保了分布式环境中的一致性和可靠性。 7. **JavaMail API**: 用于发送和接收电子邮件,支持SMTP、POP3和IMAP协议。 8. **Java ...
它包含一系列服务、API和协议,如Servlet、JSP、EJB、JMS、JTA等,用于构建可扩展且高度安全的服务器端应用。 2. **Servlet**:Servlet是Java编写的小程序,用于扩展服务器的功能,处理HTTP请求。在这个购物车项目...
1. **服务(Services)**:包括JDBC(Java Database Connectivity)用于数据库访问,JMS(Java Message Service)用于消息传递,JTA(Java Transaction API)处理事务等。 2. **组件(Components)**:主要包括EJB...
【J2EE教学全程(2) - J2EE教学全程】这一资料包是针对Java企业级应用开发(J2EE)的学习资源集合,主要包含了PPT教程和实践案例,是作者在教学过程中的精华总结。这里我们将深入探讨J2EE的相关知识点,并结合提供...
《J2EE开发手册大全》是一份全面涵盖J2EE技术开发的综合资源,旨在为开发者提供详尽的离线参考指南。这份手册包含了从基础概念到高级实践的所有关键知识点,帮助开发者在没有网络的情况下也能深入理解和应用J2EE技术...
**J2EE完全参考手册** 是一本专注于Java企业版(J2EE)技术的详尽指南,涵盖了J2EE框架、核心技术以及设计模式等多个关键领域。J2EE,全称Java 2 Platform, Enterprise Edition,是Java平台的一个版本,专为构建可...
J2EE的核心是其组件模型,包括了Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等。这些组件相互协作,构建出可伸缩、高可用性的应用...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是Java平台企业版的简称,是一个用于构建可扩展、分布式、多层的企业级应用程序的标准框架。本实践指南将深入探讨J2EE的核心概念和技术,以及如何将其应用...
J2EE(Java 2 Platform, Enterprise Edition)是Oracle公司推出的用于构建分布式企业级应用的框架,它包含了大量服务、API和协议,如Servlet、JSP、EJB、JMS、JTA等,这些组件共同构成了一个全面的开发环境。J2EE...
它为构建分布式、多层的企业级应用程序提供了全面的平台支持,包括Web组件、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等关键组件。J2EE API则是这一平台的核心组成...