spring+mybatis+Atomikos JTA事务配置说明
一、概览
Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品。产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransactions。
TransactionEssentials的主要特征:
- JTA/XA 事务管理 —— 提供事务管理和连接池
- 不需要应用服务器 —— TransactionEssentials可以在任何Java EE应用服务器中运行,也就是不依赖于任何应用服务器
- 开源 —— TransactionEssentials是遵守Apache版本2许可的开源软件
- 专注于JDBC/JMS —— 支持所有XA资源,但是资源池和消息监听是专供JDBC和JMS的
- 与Spring 和 Hibernate 集成 —— 提供了描述如何与Spring和Hibernate集成的文档
ExtremeTransactions 是基于TransactionEssentials之上的,增加了对非XA事务的支持,在servlet容器中提供了图形化管理控制面板。Atomikos还提供了基于订阅的支持服务,一份订阅可以得到访问ExtremeTransactions中额外功能的权限。
二、什么是Atomikos TransactionsEssentials
Atomikos TransactionsEssentials 是一个为Java平台提供增值服务的并且开源类事务管理器,以下是包括在这个开源版本中的一些功能:
- 全面崩溃 / 重启恢复
- 兼容标准的SUN公司JTA API
- 嵌套事务
- 为XA和非XA提供内置的JDBC适配器
- 内置的JMS适配器XA-capable JMS队列连接器
- 通过XA API兼容第三方适配器
- 更好的整合您的项目
- 集成Hibernate、mybatis等
注释:XA:XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。目前,Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。XA协议包括两套函数,以xa_开头的及以ax_开头的。
三、如何使用Atomikos TransactionsEssentials
Atomikos TransactionsEssentials 是一个可靠的库,可以加入到您的Java应用程序,也就是说为了使用这个产品,您必须添加一些jar文件(包括在dist和lib文件夹下)到您的应用程序或者应用程序服务器。
请注意:Atomikos TransactionsEssentials是一个非常快速的嵌入式事务管理器,这就意味着,您不需要另外启动一个单独的事务管理器进程(不要查找任何的bin文件夹)。相反,您的应用服务器将有它自己的intra-VM事务管理器。
配置需求:至少Java1.5 jdk,并且最少128M的内存
性能优化:尽管这个软件有着很大的优势,但是想要更好的发挥其作用,可以按以下的方法优化:
- 更高的内存,意味着更高的吞吐量(每秒的事务数目)
- 使连接池尽可能的大
- 一旦你不需要的连接请马上关闭它们。不要把你的应用程序放在缓存里,让内部连接池为你做这些,这将促使更高效的连接使用
- 不要让活动的事务闲置:终止所有情况下的事务,尤其是在异常报错情况下的事务。这将减少数据库的锁定时间,并且最大效率的处理启用的使用。
值得注意的是,在我们所有的压力测试中,Atomikos TransactionsEssentials比J2EE的web容器更高效的吞吐量。这些测量值包括日志记录的高效的事务状态,同样,在我们所有的测量中,包括XA和non-XA,高效的效率是一样的。
四、spring+mybatis+ Atomikos实现JTA事务
1.环境
- Spring3.1.3
- mybatis3.2.2
- Atomikos3.4.2
- jdk1.6
- mysql5.1.51
2.创建数据库环境,注意数据库引擎为InnoDB,只有这样才能支持事务
3.依赖jar包

4.配置
jta.properties也可命名为transactions.properties。如果不配置这个文件,项目也能启动,因为几乎所有配置项都有默认值,最好还是配置了。
jta.properties:
- comcom.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
- com.atomikos.icatch.console_file_name = tm.out
- com.atomikos.icatch.log_base_name = tmlog
- comcom.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
- com.atomikos.icatch.console_log_level = INFO
db.properties:
- jdbc.xaDataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
- jdbcjdbc.url.a=jdbc:mysql://localhost:3306/trans_a?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
- jdbc.username.a=root
- jdbcjdbc.password.a=
- jdbc.uniqueResourceName.a=trans_a
- jdbcjdbc.url.b=jdbc:mysql://localhost:3306/trans_b?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
- jdbc.username.b=root
- jdbcjdbc.password.b=
- jdbc.uniqueResourceName.b=trans_b
- transactionManager.forceShutdown =true
- transactionManager.transactionTimeout=3000
- #*********************atomikos连接池参数设置*****************************
- #连接池中保留的最小连接数
- atomikos.minPoolSize=1
- #连接池中保留的最大连接数
- atomikos.maxPoolSize=3
- #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
- atomikos.maxIdleTime=60
applicationContext-a.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <!-- 数据库配置文件位置 -->
- <context:property-placeholder location="classpath:db.properties" />
- <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
- init-method="init" destroy-method="close">
- <property name="uniqueResourceName" value="${jdbc.uniqueResourceName.a}" />
- <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" />
- <property name="xaProperties">
- <props>
- <prop key="user">${jdbc.username.a}</prop>
- <prop key="password">${jdbc.password.a}</prop>
- <prop key="URL">${jdbc.url.a}</prop>
- </props>
- </property>
- <property name="minPoolSize" value="${atomikos.minPoolSize}" />
- <property name="maxPoolSize" value="${atomikos.maxPoolSize}" />
- <property name="maxIdleTime" value="${atomikos.maxIdleTime}" />
- </bean>
- <!-- 采用注释的方式配置bean -->
- <context:annotation-config />
- <!-- 配置要扫描的包 -->
- <context:component-scan base-package="com.ssm"></context:component-scan>
- <!--proxy-target-class="true"强制使用cglib代理 如果为false则spring会自动选择-->
- <aop:aspectj-autoproxy proxy-target-class="true"/>
- <!-- 配置mybitasSqlSessionFactoryBean -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocation" value="classpath:mybatis-config.xml"></property>
- </bean>
- <!-- 配置SqlSessionTemplate -->
- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
- <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
- init-method="init" destroy-method="close">
- <property name="forceShutdown" value="${transactionManager.forceShutdown}" />
- </bean>
- <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
- <property name="transactionTimeout" value="${transactionManager.transactionTimeout}" />
- </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>
- <!-- 使用annotation注解方式配置事务 -->
- <tx:annotation-driven transaction-manager="transactionManager"/>
- </beans>
applicationContext-b.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <!-- 数据库配置文件位置 -->
- <context:property-placeholder location="classpath:db.properties" />
- <bean id="dataSource_b" class="com.atomikos.jdbc.AtomikosDataSourceBean"
- init-method="init" destroy-method="close">
- <property name="uniqueResourceName" value="${jdbc.uniqueResourceName.b}" />
- <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" />
- <property name="xaProperties">
- <props>
- <prop key="user">${jdbc.username.b}</prop>
- <prop key="password">${jdbc.password.b}</prop>
- <prop key="URL">${jdbc.url.b}</prop>
- </props>
- </property>
- <property name="minPoolSize" value="${atomikos.minPoolSize}" />
- <property name="maxPoolSize" value="${atomikos.maxPoolSize}" />
- <property name="maxIdleTime" value="${atomikos.maxIdleTime}" />
- </bean>
- <bean id="sqlSessionFactory_b" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource_b" />
- <property name="configLocation" value="classpath:mybatis-config.xml"></property>
- </bean>
- <!-- 配置SqlSessionTemplate -->
- <bean id="sqlSessionTemplate_b" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory_b" />
- </bean>
- </beans>
- transactions-essentials-all.jar (552 KB)
- 下载次数: 10
spring+mybatis+Atomikos JTA事务配置说明的更多相关文章
- 使用spring+mybatis+atomikos+tomcat构建分布式事务
本文通过一个demo,介绍如何使用spring+mybatis+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数据源 ...
- spring+mybatis+atomikos 实现JTA事务
1. 选择哪种transaction manager? 在单数据源情况下,JDBC,Hibernate,ibatis等自带的 transaction manager已能用于处理事务. ...
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理
原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...
- spring boot 或 spring 集成 atomikos jta 完成多数据源事务管理
前言:对于事务,spring 不提供自己的实现,只是定义了一个接口来供其他厂商实现,具体些的请看我的这篇文章: https://www.cnblogs.com/qiaoyutao/p/11289996 ...
- spring + mybatis 注解式事务不回滚的原因分析 @Transactional
在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...
- Spring 16: SM(Spring + MyBatis) 注解式事务 与 声明式事务
Spring事务处理方式 方式1:注解式事务 使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,注解添加到方法上,则对该方法执行事务处理 @Tran ...
- spring+mybatis之注解式事务管理初识(小实例)
1.上一章,我们谈到了spring+mybatis声明式事务管理,我们在文章末尾提到,在实际项目中,用得更多的是注解式事务管理,这一章将学习一下注解式事务管理的有关知识.注解式事务管理只需要在上一节的 ...
- JTA事务管理--配置剖析(二)
Spring引用Tomcat的 JTA事务 Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JD ...
随机推荐
- POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)
Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...
- Android-Universal-Image-Loader 学习笔记(五)线程池分析
UniveralImageLoader中的线程池 一般情况网络访问就需要App创建一个线程来执行(不然可能出现很臭的ANR),但是这也导致了当网络访问比较多的情况下,线程的数目可 ...
- 巧用FPGA中资源
随着FPGA的广泛应用,所含的资源也越来越丰富,从基本的逻辑单元.DSP资源和RAM块,甚至CPU硬核都能集成在一块芯片中.在做FPGA设计时,如果针对FPGA中资源进行HDL代码编写,对设计的资源利 ...
- Ubuntu 13.04/CentOS 6.4 下C++开发时的相关设置
Ubuntu 13.04/CentOS 6.4 下C++开发时的相关设置 一.基本设置 首先,为了可以使我们的c++ 可以找到 iostream类,std标准库,我们需要在C/C++ General- ...
- 安装vnc出现的问题
重启vnc 命令:/sbin/service vncserver start或者vncserver VNC的启动/停止/重启 #service vncserver start/stop/restart ...
- BZOJ 3211 线段树+并查集
思路: 我们很容易发现 一个数开根号 开几(很小)次 就到了1 1 再怎么开 都是1 由于这个性质 我们就可以用并查集 了 //By SiriusRen #include <cmath> ...
- Multi-process Architecture
For Developers > Design Documents > Multi-process Architecture This document describes Ch ...
- JS之字符串和数组
字符串: 属性: length:可以获取字符串的长度: <script type="text/javascript"> var str = "haha&quo ...
- C# 操作Excel常见错误
1.未在本地注册 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FilePath + &qu ...
- LINQ to SQL活学活用(1):这要打破旧观念
程序架构 如今比較经典的架构,看看以下图片. 怎样实现 在一个N层应用程序中我们怎样使用LINQ to SQL呢?这给刚刚入门的朋友的确是个难题,使用LINQ to SQL就是ORM技术,能够非常轻松 ...