一般情况下,J2EE应用服务器支持JDBC事务、JTA事务、容器管理事务。这里讨论JTA和JDBC事务的区别。这2个是常用的DAO模式事务界定方式。
JDBC 事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。例如如下片断:
import java.sql.*;
import javax.sql.*;
// ...
DataSource ds = obtainDataSource();
Connection conn = ds.getConnection();
conn.setAutoCommit(false);
// ...
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "The Great Escape");
pstmt.executeUpdate();
// ...
conn.commit();
// ...
JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 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 连本地都支持不好,更别说分布事务了。
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[]{0x01}, new byte[]{0x02});
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应用中,通常使用JNDI(Java Naming and Directory Interface)来查找和获取事务管理器。JNDI是一个服务定位器,它允许应用程序通过名称查找服务,包括事务管理器。在EJB或Java EE环境中,事务管理器通常作为...
JNDI、JTA和JMS是Java平台中非常重要的三个组件,它们分别对应于命名和目录服务、事务处理以及消息服务。以下是对这三者的详细介绍以及它们在实际应用中的相关知识点。 1. JNDI(Java Naming and Directory ...
- **JNDI(Java Naming and Directory Interface)**:用于查找和绑定数据源,是Java应用服务器的标准服务。 - **XA事务**:JTA使用的两阶段提交(2PC)协议,保证所有参与的资源在同一时间提交或回滚。 - **异常...
JTA事务通常与JNDI(Java Naming and Directory Interface)和XAResource接口一起工作,使得应用程序可以透明地访问和管理分布式事务。使用JTA事务时,开发者不再直接控制Connection的事务,而是由事务管理器(如...
开发者可以通过JNDI(Java Naming and Directory Interface)查找UserTransaction实例来控制事务。 2. **TransactionManager**:更底层的事务管理接口,提供了更复杂的事务控制功能,如设置事务超时、恢复已知事务...
7. **Java Naming and Directory Interface (JNDI)**:在JTA中,JNDI常用来查找和注册事务管理器和其他资源管理器,使它们能够在应用程序中被透明地使用。 8. **编程模式**:JTA提供了两种主要的编程模式:显式事务...
在Spring框架中,JNDI(Java Naming and Directory Interface)主要用来查找和绑定资源,如数据源、EJB等。JNDI允许我们通过名称来访问分布式环境中的对象,这在多层架构或集群环境中非常有用。下面我们将深入探讨...
- **JNDI查找UserTransaction**:演示如何通过Java Naming and Directory Interface(JNDI)查找并使用UserTransaction实例。 - **异常处理和事务边界**:展示如何正确地处理业务异常,以及何时应该回滚事务。 - **...
通过JNDI(Java Naming and Directory Interface)查找,EJB可以透明地访问这些数据源,参与分布式事务。 4. **JTA 和 XA 事务** JTA 是Java平台的标准事务API,支持分布式事务。在ejb3.0中,使用JTA进行事务管理...
在Weblogic上配置Hibernate为JNDI涉及到的关键技术包括Weblogic服务器、Hibernate持久化框架以及Java Naming and Directory Interface (JNDI)。JNDI是一个Java API,它允许应用程序查找和访问不同类型的命名和目录...
在这个版本中,配置JNDI(Java Naming and Directory Interface)和Hibernate,一个流行的ORM(对象关系映射)框架,对于企业级应用的开发至关重要。本文将详细介绍这两个关键组件的配置过程和相关知识点。 **一、...
在Java EE环境中,JOTM可以作为全局事务管理器,通过Java Naming and Directory Interface (JNDI)进行查找和绑定。开发者可以在EJBs、Servlets或任何其他Java EE组件中透明地使用JTA事务。 **使用JOTM** 1. **配置*...
Atomikos 提供了JNDI(Java Naming and Directory Interface)接口来注册这些资源,使得它们可以在全局事务中被查找和使用。 4. **开启事务**:在业务逻辑开始时,通过Atomikos提供的API启动一个新的全局事务。这会...
2. **配置JTA**:在Tomcat的server.xml或context.xml文件中,需要配置GlobalNamingResources来启用JNDI(Java Naming and Directory Interface),并声明事务管理器。 3. **配置Hibernate**:在Hibernate的配置文件...
EJB使用JNDI(Java Naming and Directory Interface)进行服务查找和绑定,这是一种在分布式环境中定位对象的机制。本压缩包包含了一个EJB中JNDI使用源码的例子,可以帮助开发者深入理解这两者之间的交互。 在Java ...
6. **JNDI(Java Naming and Directory Interface)**: JNDI提供了一个统一的接口来查找和绑定资源,如数据源、邮件会话等。在系统中,JNDI可能用于查找数据库连接或其他服务。 7. **JTA(Java Transaction API)...
通过JNDI(Java Naming and Directory Interface)服务,应用程序可以查找并使用事务管理器,从而进行复杂的事务操作。 总结起来,"jta-1_0_1B-classes.zip"包含的是JTA 1.0.1B版本的类库,是构建和维护高可用、高...
最后,熟悉 JTA 和 JNDI,提升应用的事务管理和资源查找能力。 **J2EE 入门教程文档** 提供的 "J2EE入门教程.doc" 文件将详细解释这些概念,包含实例代码和实践指导,是学习 J2EE 的宝贵资源。通过深入阅读并动手...
本书是 Java 2 Enterprise Edition 1.4 的权威指南,涵盖了 Java EE 1.4 版本的所有主要组件和技术,包括 Servlet、JSP、EJB、JMS、JTA、JNDI 等。书中还详细介绍了 Java EE 1.4 的架构设计、安全机制、事务处理、...
**六、JNDI(Java Naming and Directory Interface)** JNDI提供了一种标准的方式来查找和绑定命名和目录服务。在J2EE环境中,它常用于查找EJB、数据源和其他服务。 **七、实验内容** 本J2EE实验报告可能涵盖了...