Spring-事物-不依赖应用服务器的开源JTA事物实现
不依赖应用服务器的开源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事物实现的更多相关文章
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- Spring学习(一)——Spring中的依赖注入简介
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...
- Spring 的循环依赖问题
什么是循环依赖 什么是循环依赖呢?可以把它拆分成循环和依赖两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路:依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致.放到 S ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 谈谈自己了解的spring.NET的依赖注入
spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring的循环依赖问题
spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...
随机推荐
- [cocos2dx]利用NDK崩溃日志查找BUG
摘要: 在android上开发c++应用, crash日志都是汇编码, 很难对应到c++代码中去. 通过此文, 你可以定位到程序崩溃时的C++代码, 精确查找问题. 博客: http://www.cn ...
- 软件工程实训项目案例--Android移动应用开发
实训过程 角色分工 1.项目经理:负责项目的组织实施,制定项目计划,并进行跟踪管理 2.开发人员:对项目经理及项目负责 3.需求分析员:负责系统的需求获取和分析,并协助设计人员进行系统设计 4.系统设 ...
- jquery 地址栏链接与a标签链接匹配 特效代码总结(二)
如题所述,当出现这样的功能,点击某个链接后,给跳转后的该链接地址添加样式,通过添加class为current来增加特殊样式. 如图所示:点击HTML+css3跳转后,给其添加如图样式: js代码如下: ...
- python中range函数和xrange函数有什么异同?
http://ciniao.me/article.php?id=17 简单来说,range生成的是一个列表,而xrange生成的是一个生成器,而生成器在数组很大的时候能够比range更节省空间
- 后台首页品字形(frameset)框架搭建
get_defined_constants([true])//显示所有常量信息.参数true,表示分组显示,查看当前系统给我提供了哪些常量可以使用,包括自定义常量. __CONTROLLER__//获 ...
- Power Builder的学习
新的任务可能要运用PowerBuilder了,对这个名词之前仅是有所耳闻,工作中倒是用过power designer这个优秀的建模工具,出自同一家公司的产品,应该拥有同样的基因,于是上网开始查阅相关资 ...
- ASP.NET MVC 扩展数据验证 转
此文只作记录 public class MaxWordsAttribute : ValidationAttribute { public MaxWordsAttribute(int maxWords) ...
- 30Springd的包扫描——<context:component-scan base-package=” ”/>
在context中配置 如:在base-package指明一个包: <context:component-scan base-package="cn.edu.dao"/> ...
- Linux内核启动
Linux内核启动过程概述 Linux的启动代码真的挺大,从汇编到C,从Makefile到LDS文件,需要理解的东西很多.毕竟Linux内核是由很多人,花费了巨大的时间和精力写出来的.而且直到现在,这 ...
- C语言 文件操作9--fgetc()和fputc()
//fgetc()和fputc() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...