`
My_Choice
  • 浏览: 39477 次
  • 性别: Icon_minigender_1
  • 来自: 河北保定
文章分类
社区版块
存档分类
最新评论

JTA and jndi 事务

阅读更多
一般情况下,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>
分享到:
评论
1 楼 sunshing 2011-01-25  
学习了,谢谢!

相关推荐

    JTA分布式事务使用示例代码

    在Java应用中,通常使用JNDI(Java Naming and Directory Interface)来查找和获取事务管理器。JNDI是一个服务定位器,它允许应用程序通过名称查找服务,包括事务管理器。在EJB或Java EE环境中,事务管理器通常作为...

    JNDI,JTA和JMS简介

    JNDI、JTA和JMS是Java平台中非常重要的三个组件,它们分别对应于命名和目录服务、事务处理以及消息服务。以下是对这三者的详细介绍以及它们在实际应用中的相关知识点。 1. JNDI(Java Naming and Directory ...

    多数据源事务jta测试

    - **JNDI(Java Naming and Directory Interface)**:用于查找和绑定数据源,是Java应用服务器的标准服务。 - **XA事务**:JTA使用的两阶段提交(2PC)协议,保证所有参与的资源在同一时间提交或回滚。 - **异常...

    Java中JDBC事务与JTA分布式事务总结与区别

    JTA事务通常与JNDI(Java Naming and Directory Interface)和XAResource接口一起工作,使得应用程序可以透明地访问和管理分布式事务。使用JTA事务时,开发者不再直接控制Connection的事务,而是由事务管理器(如...

    jta-1.0.1B.jar

    开发者可以通过JNDI(Java Naming and Directory Interface)查找UserTransaction实例来控制事务。 2. **TransactionManager**:更底层的事务管理接口,提供了更复杂的事务控制功能,如设置事务超时、恢复已知事务...

    JAVA JTA jar-doc-spec

    7. **Java Naming and Directory Interface (JNDI)**:在JTA中,JNDI常用来查找和注册事务管理器和其他资源管理器,使它们能够在应用程序中被透明地使用。 8. **编程模式**:JTA提供了两种主要的编程模式:显式事务...

    spring 配置jndi

    在Spring框架中,JNDI(Java Naming and Directory Interface)主要用来查找和绑定资源,如数据源、EJB等。JNDI允许我们通过名称来访问分布式环境中的对象,这在多层架构或集群环境中非常有用。下面我们将深入探讨...

    michael_jta_code

    - **JNDI查找UserTransaction**:演示如何通过Java Naming and Directory Interface(JNDI)查找并使用UserTransaction实例。 - **异常处理和事务边界**:展示如何正确地处理业务异常,以及何时应该回滚事务。 - **...

    ejb3.0 分布式事务

    通过JNDI(Java Naming and Directory Interface)查找,EJB可以透明地访问这些数据源,参与分布式事务。 4. **JTA 和 XA 事务** JTA 是Java平台的标准事务API,支持分布式事务。在ejb3.0中,使用JTA进行事务管理...

    在Weblogic上配置Hibernate为JNDI

    在Weblogic上配置Hibernate为JNDI涉及到的关键技术包括Weblogic服务器、Hibernate持久化框架以及Java Naming and Directory Interface (JNDI)。JNDI是一个Java API,它允许应用程序查找和访问不同类型的命名和目录...

    Jboss6.0.0 M4配置jndi和hibernate

    在这个版本中,配置JNDI(Java Naming and Directory Interface)和Hibernate,一个流行的ORM(对象关系映射)框架,对于企业级应用的开发至关重要。本文将详细介绍这两个关键组件的配置过程和相关知识点。 **一、...

    开源事务管理器 JOTM

    在Java EE环境中,JOTM可以作为全局事务管理器,通过Java Naming and Directory Interface (JNDI)进行查找和绑定。开发者可以在EJBs、Servlets或任何其他Java EE组件中透明地使用JTA事务。 **使用JOTM** 1. **配置*...

    Atomikos实现分布式事务

    Atomikos 提供了JNDI(Java Naming and Directory Interface)接口来注册这些资源,使得它们可以在全局事务中被查找和使用。 4. **开启事务**:在业务逻辑开始时,通过Atomikos提供的API启动一个新的全局事务。这会...

    hibernate+tomca5.5t+JOTM 2.10 JTA配置

    2. **配置JTA**:在Tomcat的server.xml或context.xml文件中,需要配置GlobalNamingResources来启用JNDI(Java Naming and Directory Interface),并声明事务管理器。 3. **配置Hibernate**:在Hibernate的配置文件...

    java源码:EJB中JNDI的使用源码例子.zip

    EJB使用JNDI(Java Naming and Directory Interface)进行服务查找和绑定,这是一种在分布式环境中定位对象的机制。本压缩包包含了一个EJB中JNDI使用源码的例子,可以帮助开发者深入理解这两者之间的交互。 在Java ...

    基于JavaEE的学生会服务与事务管理系统.zip

    6. **JNDI(Java Naming and Directory Interface)**: JNDI提供了一个统一的接口来查找和绑定资源,如数据源、邮件会话等。在系统中,JNDI可能用于查找数据库连接或其他服务。 7. **JTA(Java Transaction API)...

    jta-1_0_1B-classes.zip

    通过JNDI(Java Naming and Directory Interface)服务,应用程序可以查找并使用事务管理器,从而进行复杂的事务操作。 总结起来,"jta-1_0_1B-classes.zip"包含的是JTA 1.0.1B版本的类库,是构建和维护高可用、高...

    J2EE入门经典教程

    最后,熟悉 JTA 和 JNDI,提升应用的事务管理和资源查找能力。 **J2EE 入门教程文档** 提供的 "J2EE入门教程.doc" 文件将详细解释这些概念,包含实例代码和实践指导,是学习 J2EE 的宝贵资源。通过深入阅读并动手...

    Java.2.Enterprise.Edition.1.4.J2EE.1.4.Bible

    本书是 Java 2 Enterprise Edition 1.4 的权威指南,涵盖了 Java EE 1.4 版本的所有主要组件和技术,包括 Servlet、JSP、EJB、JMS、JTA、JNDI 等。书中还详细介绍了 Java EE 1.4 的架构设计、安全机制、事务处理、...

    J2EE本科实验报告

    **六、JNDI(Java Naming and Directory Interface)** JNDI提供了一种标准的方式来查找和绑定命名和目录服务。在J2EE环境中,它常用于查找EJB、数据源和其他服务。 **七、实验内容** 本J2EE实验报告可能涵盖了...

Global site tag (gtag.js) - Google Analytics