不依赖应用服务器的开源JTA事物实现JOTM和Atomikos Transactions

JOTM
即基于Java开放事务管理器(Java Open Transaction Manager),实现JTA规范,能够运行在非应用服务器环境中,Web容器或独立Java SE环境,官网地址: http://jotm.objectweb.org/。
Atomikos Transactions Essentials
其为Atomikos开发的事务管理器,该产品属于开源产品,另外还一个商业的Extreme Transactions。官网地址为:http://www.atomikos.com。

  在本文中将使用Atomikos Transactions Essentials来进行演示JTA事务使用,由于Atomikos对hsqldb分布式支持不是很好,在Atomikos官网中列出如下兼容的数据库:Oracle、Informix、FirstSQL、DB2、MySQL、SQLServer、Sybase,这不代表其他数据库不支持,而是Atomikos团队没完全测试,在此作者决定使用derby内存数据库来演示JTA分布式事务。

1、首先准备jar包:

1.1、准备derby数据jar包,到下载的spring-framework-3.0.5.RELEASE-dependencies.zip中拷贝如下jar包:

com.springsource.org.apache.derby-10.5.1000001.764942.jar


1
2、准备Atomikos Transactions Essentials JTA事务支持的JTA包,此处使用AtomikosTransactionsEssentials3.5.5版本,到官网下载AtomikosTransactionsEssentials-3.5.5.zip,拷贝如下jar包到类路径:

  atomikos-util.jar

  transactions-api.jar

  transactions-essentials-all.jar

  transactions-jdbc.jar

  transactions-jta.jar

  transactions.jar

将如上jar包放在lib\atomikos目录下,并添加到类路径中。

2、接下来看一下在Spring中如何配置AtomikosTransactionsEssentials JTA事务:

2.1、配置分布式数据源:

  
<bean id="dataSource1" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="jdbc/test1"/>
<property name="xaDataSourceClassName" value="org.apache.derby.jdbc.EmbeddedXADataSource"/>
<property name="poolSize" value="5"/>
<property name="xaProperties">
<props>
<prop key="databaseName">test1</prop>
<prop key="createDatabase">create</prop>
</props>
</property>
</bean> <bean id="dataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
……
</bean>

 在此我们配置两个分布式数据源:使用com.atomikos.jdbc.AtomikosDataSourceBean来配置AtomikosTransactionsEssentials分布式数据源:

  • uniqueResourceName表示唯一资源名,如有多个数据源不可重复;
  • xaDataSourceClassName是具体分布式数据源厂商实现;
  • poolSize是数据连接池大小;
  • xaProperties属性指定具体厂商数据库属性,如databaseName指定数据库名,createDatabase表示启动derby内嵌数据库时创建databaseName指定的数据库。

  在此我们还有定义了一个“dataSource2”Bean,其属性和“DataSource1”除以下不一样其他完全一样:

  • uniqueResourceName:因为不能重复,因此此处使用jdbc/test2;
  • databaseName:我们需要指定两个数据库,因此此处我们指定为test2。

2.2、配置事务管理器:

<bean id="atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method = "close">
<property name="forceShutdown" value="true"/>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> </bean> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction"/>
</property>
</bean>
  • atomikosTransactionManager:定义了AtomikosTransactionsEssentials事务管理器;
  • atomikosUserTransaction:定义UserTransaction,该Bean是线程安全的;
  • transactionManager:定义Spring事务管理器,transactionManager属性指定外部事务管理器(真正的事务管理者),使用userTransaction指定UserTransaction,该属性一般用于本地JTA实现,如果使用应用服务器事务管理器,该属性将自动从JNDI获取。

配置完毕,是不是也挺简单的,但是如果确实需要使用JTA事务,请首先选择应用服务器事务管理器,本示例不适合生产环境,如果非要运用到生产环境,可以考虑购买AtomikosTransactionsEssentials商业支持。

  b)特定服务器事务管理器

  Spring还提供了对特定应用服务器事务管理器集成的支持,目前提供对IBM WebSphere、BEA WebLogic、 Oracle OC4J应用服务器高级事务的支持,具体使用请参考Spring Javadoc。

  现在我们已经学习如何配置事务管理器了,但是只有事务管理器Spring能自动进行事务管理吗?当然不能了,这需要我们来控制,目前Spring支持两种事务管理方式:编程式和声明式事务管理。接下来先看一下如何进行编程式事务管理吧。

Spring-事物-不依赖应用服务器的开源JTA事物实现的更多相关文章

  1. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  2. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  3. Spring学习(一)——Spring中的依赖注入简介

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  4. Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了

    阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...

  5. Spring 的循环依赖问题

    什么是循环依赖 什么是循环依赖呢?可以把它拆分成循环和依赖两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路:依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致.放到 S ...

  6. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转

    Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...

  7. 谈谈自己了解的spring.NET的依赖注入

         spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...

  8. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  9. Spring的循环依赖问题

    spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...

随机推荐

  1. 怎样对ZBrush中的材料进行渲染和着色

    ZBrush可以实时的进行不断的渲染和着色. 对于绘制操作,ZBrush®增加了新的范围尺度,可以让你给基于像素的作品增加深度,材质,光照和复杂精密的渲染特效,真正实现了 2D 与 3D 的结合,模糊 ...

  2. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  3. AC日记——逃出克隆岛 (bfs)

    2059 逃出克隆岛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description oi小组的yh酷爱玩魔兽rpg,每天都 ...

  4. Update和LateUpdate的区别

    LateUpdate晚于所有Update执行 在圣典里LateUpdate被解释成一句话:LateUpdate是在所有Update函数调用后被调用.这可用于调整脚本执行顺序. 当物体在Update里移 ...

  5. [转] Centos 6.4 python 2.6 升级到 2.7

    http://blog.csdn.net/jcjc918/article/details/11022345

  6. EventBus (四) Sticky事件

    什么是Sticky事件? 关于Sticky事件有的同学可能不是很熟悉,Sticky的意思是粘性的.在Android开 发中,Sticky事件只指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类 ...

  7. Window.open()方法参数详解

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  8. f2fs解析(十)nid 如何从nat_root中删除

    上面我们谈到了一个nid如何从free_nid中转移到node_info中去[分别有一个链表和一棵基数树搭伙做事],讲free_nid时,详细说明了free_nid中是如何进如何出的,上一篇说了nid ...

  9. sql 索引 填充因子(转)

    和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味 ...

  10. [4]Telerik Grid 简单使用方法

    1.columns <% Html.Telerik().Grid(Model) .Name("Orders") .Columns(columns => { //绑定列名 ...