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下载地址 :

Xml代码  

  1. comcom.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
  2. com.atomikos.icatch.console_file_name = tm.out
  3. com.atomikos.icatch.log_base_name = tmlog
  4. comcom.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
  5. com.atomikos.icatch.console_log_level = INFO

db.properties:

Xml代码  

  1. jdbc.xaDataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
  2. jdbcjdbc.url.a=jdbc:mysql://localhost:3306/trans_a?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
  3. jdbc.username.a=root
  4. jdbcjdbc.password.a=
  5. jdbc.uniqueResourceName.a=trans_a
  6. jdbcjdbc.url.b=jdbc:mysql://localhost:3306/trans_b?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
  7. jdbc.username.b=root
  8. jdbcjdbc.password.b=
  9. jdbc.uniqueResourceName.b=trans_b
  10. transactionManager.forceShutdown =true
  11. transactionManager.transactionTimeout=3000
  12. #*********************atomikos连接池参数设置*****************************
  13. #连接池中保留的最小连接数
  14. atomikos.minPoolSize=1
  15. #连接池中保留的最大连接数
  16. atomikos.maxPoolSize=3
  17. #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
  18. atomikos.maxIdleTime=60

applicationContext-a.xml:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/aop
  10. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  11. http://www.springframework.org/schema/tx
  12. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  15. <!-- 数据库配置文件位置 -->
  16. <context:property-placeholder location="classpath:db.properties" />
  17. <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
  18. init-method="init" destroy-method="close">
  19. <property name="uniqueResourceName" value="${jdbc.uniqueResourceName.a}" />
  20. <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" />
  21. <property name="xaProperties">
  22. <props>
  23. <prop key="user">${jdbc.username.a}</prop>
  24. <prop key="password">${jdbc.password.a}</prop>
  25. <prop key="URL">${jdbc.url.a}</prop>
  26. </props>
  27. </property>
  28. <property name="minPoolSize" value="${atomikos.minPoolSize}" />
  29. <property name="maxPoolSize" value="${atomikos.maxPoolSize}" />
  30. <property name="maxIdleTime" value="${atomikos.maxIdleTime}" />
  31. </bean>
  32. <!-- 采用注释的方式配置bean -->
  33. <context:annotation-config />
  34. <!-- 配置要扫描的包 -->
  35. <context:component-scan base-package="com.ssm"></context:component-scan>
  36. <!--proxy-target-class="true"强制使用cglib代理   如果为false则spring会自动选择-->
  37. <aop:aspectj-autoproxy  proxy-target-class="true"/>
  38. <!-- 配置mybitasSqlSessionFactoryBean -->
  39. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  40. <property name="dataSource" ref="dataSource" />
  41. <property name="configLocation" value="classpath:mybatis-config.xml"></property>
  42. </bean>
  43. <!-- 配置SqlSessionTemplate -->
  44. <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
  45. <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
  46. </bean>
  47. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
  48. init-method="init" destroy-method="close">
  49. <property name="forceShutdown" value="${transactionManager.forceShutdown}" />
  50. </bean>
  51. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  52. <property name="transactionTimeout" value="${transactionManager.transactionTimeout}" />
  53. </bean>
  54. <bean id="transactionManager"
  55. class="org.springframework.transaction.jta.JtaTransactionManager">
  56. <property name="transactionManager">
  57. <ref bean="atomikosTransactionManager" />
  58. </property>
  59. <property name="userTransaction">
  60. <ref bean="atomikosUserTransaction" />
  61. </property>
  62. </bean>
  63. <!-- 使用annotation注解方式配置事务 -->
  64. <tx:annotation-driven transaction-manager="transactionManager"/>
  65. </beans>

applicationContext-b.xml:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/aop
  10. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  11. http://www.springframework.org/schema/tx
  12. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  15. <!-- 数据库配置文件位置 -->
  16. <context:property-placeholder location="classpath:db.properties" />
  17. <bean id="dataSource_b" class="com.atomikos.jdbc.AtomikosDataSourceBean"
  18. init-method="init" destroy-method="close">
  19. <property name="uniqueResourceName" value="${jdbc.uniqueResourceName.b}" />
  20. <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" />
  21. <property name="xaProperties">
  22. <props>
  23. <prop key="user">${jdbc.username.b}</prop>
  24. <prop key="password">${jdbc.password.b}</prop>
  25. <prop key="URL">${jdbc.url.b}</prop>
  26. </props>
  27. </property>
  28. <property name="minPoolSize" value="${atomikos.minPoolSize}" />
  29. <property name="maxPoolSize" value="${atomikos.maxPoolSize}" />
  30. <property name="maxIdleTime" value="${atomikos.maxIdleTime}" />
  31. </bean>
  32. <bean id="sqlSessionFactory_b" class="org.mybatis.spring.SqlSessionFactoryBean">
  33. <property name="dataSource" ref="dataSource_b" />
  34. <property name="configLocation" value="classpath:mybatis-config.xml"></property>
  35. </bean>
  36. <!-- 配置SqlSessionTemplate -->
  37. <bean id="sqlSessionTemplate_b" class="org.mybatis.spring.SqlSessionTemplate">
  38. <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory_b" />
  39. </bean>
  40. </beans>
时间: 2024-08-07 14:37:46

spring+mybatis+Atomikos JTA事务配置说明的相关文章

基于spring+mybatis+atomikos+jta实现分布式事务(2)-动态切换数据源

本文介绍基于spring+mybatis+atomikos+jta实现分布式事务,由程序动态切换数据源,通过atomikos可实现分布式事务一致性. 版本:spring-3.2.9.RELEASE.mybatis-3.4.4.atomikos-4.0.5.jdk1.8 1,maven配置文件pom.xml如下: <!-- test --> <dependency> <groupId>junit</groupId> <artifactId>juni

使用spring+mybatis+atomikos+tomcat构建分布式事务

本文通过一个demo,介绍如何使用spring+mybatis+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数据源的XA事务. demo将实现: 1.一次性在两个数据库的两张表中各插入一条数据并提交. 2.一次性在两个数据库的两张表中各插入一条数据并回滚. 测试方式:restful web api 使用工具: spring 4.1.1.RELEASE mybatis 3.2.7 atomikos 3.7.0 t

Spring事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

本文转载于本人另一博客[http://blog.csdn.net/liaohaojian/article/details/68488150] 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确

spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理

转载自:http://blog.csdn.net/liaohaojian/article/details/68488150 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整

Spring+Mybatis @Transactional注解事务不生效

@Transactional声明式事务配置: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 声明式事务配

Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis

项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持jtom[jta]了,第三方开源软件atomikos(http://www.atomikos.com/)来实现. 2:org.springframework.transaction.jta.JotmFactoryBean类,spring-tx-2.5.6.jar中有此类,spring-tx-3.0.

Spring+iBatis+Atomikos实现JTA事务

Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品. 产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransactions. TransactionEssentials的主要特征: JTA/XA 事务管理 —— 提供事务管理和连接池 不需要应用服务器 —— TransactionEssentials可以在任何Java EE应用服务器中运行,也就是不依赖于任何应用服务器 开源 —— TransactionEssen

SpringMVC+MyBatis+JMS+JTA(分布式事务)

SpringMVC+MyBatis 相信已经是现在企业开发中常用技术了. 因为一些需求,我们需要集成JMS(我使用的是ActiveMQ),大家应该都知道,MQ也可以认为是一个数据源,数据也是数据源.这种情况下,如果我们在一个方法内操作JMS和数据库,我们就需要保证这个方法执行需要满足原子性. 这也就意味这一个问题,我们要多个数据源在同一个事务中.这里不枚举市面上的所有解决方案,其实atomikos JTA 是一个比较不错分布式事务管理器. 当然如果没有使用到JMS,在需要多数据源(也就是需要连接

【分布式事务】使用atomikos+jta解决分布式事务问题

一.前言 分布式事务,这个问题困惑了小编很久,在3个月之前,就间断性的研究分布式事务.从MQ方面,数据库事务方面,jta方面.近期终于成功了,使用JTA解决了分布式事务问题.先写一下心得,后面的二级提交也会在研究. 二.介绍 分布式事务 说到分布式事务,可以理解为,由于分布式而引起的事务不一致的问题.随着项目做大,模块拆分,数据库拆分.一次包含增删改操作数据库涉及到了更新两个不同物理节点的数据库,这样的数据库事务只能保证自己处理的部分的事务,但是整个的事务就不能保证一致性. 网上针对分布式事务常