快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

Java分布式事务概念与实现示例

 

在java中有如下三种事务,

  • 简朴的JDBC级的事务
  • JTA - 在EJB环境下,用户得到事务并进行控制
  • CMP - 完全由容器控制事务,用户通过Bean配置文件来定义事务行为

二三种都支持分布式事务,但只支持Java环境下的分布式事务。

下面讨论如何在Java程序里实现分布式事务,即在同一个事务里访问多个数据源。实际上就是如何使用JTA.

这里假设使用Oracle数据库,使用WebLogic部署应用,所要做的是如下几步:

1. 配置

1.1 确认数据库支持分布式事务 - oracle是支持分布式事务的,JDBC驱动也支持分布式事务

1.2 在WebLogic里配置DataSource

1.2.1. 配置连接池,注重这里应该选择驱动是Thin XA而不是Thin

1.2.2. 配置数据源,使用前面配好的XA的连接池

2. 程序实现

2.1. 实现自己的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;
 }

}
2.2. 通过JNDI找到WebLogic中配置好的数据源

public XADataSource getXADataSource()
 throws Exception
{
InitialContext ctx = new InitialContext( mgr.getProps());
XADataSource ds = (XADataSource)ctx.lookup(\"jdbc/xaDS\");
return ds;
}
2.3. 使用XADataSource得到XAConnection,使用XAConnection得到XAResource,基于XAResource进行详细数据访问。假如我们这里lookup多个XADataSource,然后得到多个XAResource,就可以实现多数据源的事务控制。

XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getXADataSource();
xaCon = xaDS.getXAConnection();
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();
}




返回类别: 教程
上一教程: JDBCTM 指南:入门
下一教程: java工具之javadoc和jar浅学 选择自 shaobotao 的 Blog

您可以阅读与"Java分布式事务概念与实现示例"相关的教程:
· 利用RMI实现JAVA分布式应用
· 面向对象的设计与实现的一些基础但重要的概念
· Java中数据库事务处理的实现
· "Java中可复用事件处理的设计与实现"代码
· 基于JAVA技术的搜索引擎的研究与实现
    微笑服务 优质保证 索取样品