1. 选择哪种transaction manager?
     在单数据源情况下,JDBC,Hibernate,ibatis等自带的 transaction manager已能用于处理事务。
    但当设计多种数据源的事务处理时,上面的transaction manager就没法用了。这个时候可选事务管理组件有:Bitronix,SimpleJTA,Tyrex (dead?), JOTM (used in Jonas),GeronimoTM/Jencks (used in Geronimo),JBossTS (used in JBoss) andAtomikos. 其中Atomikos 被大多数人所推荐。

2. 最近弄一个框架,使用spring3.0.5+mybatis3.0.5,需要访问多库,要应用分布式事务JTA,这是用atomikos 3.70版本,并把配置做一下记录。

配置多个数据源
 
Xml代码 
<!-- 第一个数据库 -->  
     <bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean"  
         init-method="init" destroy-method="close">  
         <property name="uniqueResourceName" value="mysql/main" />  
         <property name="xaDataSourceClassName"  
             value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />  
         <property name="xaDataSourceProperties"  
             value="URL=${jdbc.url.a};user=${jdbc.username.a};password=${jdbc.password.a}" />  
         <property name="exclusiveConnectionMode" value="true" />  
         <property name="connectionPoolSize" value="10" />  
         <property name="validatingQuery">  
             <value>SELECT 1</value>  
         </property>  
     </bean>  
     <!-- 第二个数据库 -->  
     <bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean"  
         init-method="init" destroy-method="close">  
         <property name="uniqueResourceName" value="mysql/news" />  
         <property name="xaDataSourceClassName"  
             value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />  
         <property name="xaDataSourceProperties"  
             value="URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}" />  
         <property name="exclusiveConnectionMode" value="true" />  
         <property name="connectionPoolSize" value="10" />  
         <property name="validatingQuery">  
             <value>SELECT 1</value>  
         </property>  
     </bean>  
<!-- 第一个数据库 -->
<bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="mysql/main" />
<property name="xaDataSourceClassName"
value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
<property name="xaDataSourceProperties"
value="URL=${jdbc.url.a};user=${jdbc.username.a};password=${jdbc.password.a}" />
<property name="exclusiveConnectionMode" value="true" />
<property name="connectionPoolSize" value="10" />
<property name="validatingQuery">
<value>SELECT 1</value>
</property>
</bean>
<!-- 第二个数据库 -->
<bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="mysql/news" />
<property name="xaDataSourceClassName"
value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
<property name="xaDataSourceProperties"
value="URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}" />
<property name="exclusiveConnectionMode" value="true" />
<property name="connectionPoolSize" value="10" />
<property name="validatingQuery">
<value>SELECT 1</value>
</property>
</bean>
 
 
配置mybatis的SessionFactory
 
 
Xml代码 
<bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean">  
     <property name="configLocation" value="classpath:mybatis/mybatis-config-b.xml" />  
     <property name="dataSource" ref="dataSourceB" />  
 </bean>  
   
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
     <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />  
     <property name="dataSource" ref="dataSource" />  
 </bean>  
<bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/mybatis-config-b.xml" />
<property name="dataSource" ref="dataSourceB" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
 这里使用的是SessionFactory,不是org.springframework.orm.ibatis.SqlMapClientFactoryBean,在mybatis3中用SqlMapClientFactoryBean汇报com.ibatis.common.xml.NodeletException 异常。
 
configLocation 对应的mybatis配置,跟平时配置一样。
Xml代码 
<?xml version="1.0" encoding="UTF-8" ?>  
 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  
 <configuration>  
     <typeAliases>  
         <typeAlias alias="User"  type="com.lantii.domain.User"/>  
     </typeAliases>  
     <mappers>  
         <mapper resource="com/lantii/dao/UserMapper.xml" />  
     </mappers>  
 </configuration>    
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="User"  type="com.lantii.domain.User"/>
</typeAliases>
<mappers>
<mapper resource="com/lantii/dao/UserMapper.xml" />
</mappers>
</configuration>

 事务这块用spring管理atomikos
Xml代码 
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"  
         init-method="init" destroy-method="close">  
         <property name="forceShutdown">  
             <value>true</value>  
         </property>  
     </bean>  
   
     <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
         <property name="transactionTimeout" value="300" />  
     </bean>  
   
     <bean id="springTransactionManager"  
         class="org.springframework.transaction.jta.JtaTransactionManager">  
         <property name="transactionManager">  
             <ref bean="atomikosTransactionManager" />  
         </property>  
         <property name="userTransaction">  
             <ref bean="atomikosUserTransaction" />  
         </property>  
     </bean>  
   
     <aop:aspectj-autoproxy />  
   
     <aop:config  proxy-target-class="true">  
         <aop:advisor pointcut="execution(* *com.lantii.service..*(..))"  
             advice-ref="txAdvice" />  
     </aop:config>  
   
     <tx:advice id="txAdvice" transaction-manager="springTransactionManager">  
         <tx:attributes>  
             <tx:method name="get*"  propagation="REQUIRED"  read-only="true" />  
             <tx:method name="find*"  propagation="REQUIRED"  read-only="true" />  
             <tx:method name="has*"  propagation="REQUIRED"  read-only="true" />  
             <tx:method name="locate*"  propagation="REQUIRED"  read-only="true" />  
             <tx:method name="*"  propagation="REQUIRED" rollback-for="Exception"  />  
         </tx:attributes>  
     </tx:advice>  
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown">
<value>true</value>
</property>
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>

<bean id="springTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
</bean>

<aop:aspectj-autoproxy />

<aop:config  proxy-target-class="true">
<aop:advisor pointcut="execution(* *com.lantii.service..*(..))"
advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="springTransactionManager">
<tx:attributes>
<tx:method name="get*"  propagation="REQUIRED"  read-only="true" />
<tx:method name="find*"  propagation="REQUIRED"  read-only="true" />
<tx:method name="has*"  propagation="REQUIRED"  read-only="true" />
<tx:method name="locate*"  propagation="REQUIRED"  read-only="true" />
<tx:method name="*"  propagation="REQUIRED" rollback-for="Exception"  />
</tx:attributes>
</tx:advice>
 
Mapper的管理及注入
Xml代码 
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
         <property name="sqlSessionFactory" ref="sqlSessionFactory" />  
         <property name="mapperInterface" value="com.lantii.dao.UserMapper" />  
     </bean>  
        
     <bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
         <property name="sqlSessionFactory" ref="sqlSessionFactoryB" />  
         <property name="mapperInterface" value="com.lantii.dao.RoleMapper" />  
     </bean>  
   
     <bean id="userService" class="com.lantii.service.UserServiceImpl">  
         <property name="userMapper" ref="userMapper" />  
         <property name="roleMapper" ref="roleMapper" />  
     </bean>  
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="com.lantii.dao.UserMapper" />
</bean>

<bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryB" />
<property name="mapperInterface" value="com.lantii.dao.RoleMapper" />
</bean>

<bean id="userService" class="com.lantii.service.UserServiceImpl">
<property name="userMapper" ref="userMapper" />
<property name="roleMapper" ref="roleMapper" />
</bean>  
atomikos的配置jta.properties,该文件放在应用classpath下面
Java代码 
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory   
 com.atomikos.icatch.console_file_name = tm.out   
 com.atomikos.icatch.log_base_name = tmlog   
 com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm   
 com.atomikos.icatch.console_log_level=WARN  
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.console_file_name = tm.out
com.atomikos.icatch.log_base_name = tmlog
com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
com.atomikos.icatch.console_log_level=WARN
  
这几基本配置完毕,需要jar包
atomikos-util.jar
transactions.jar
transactions-jta.jar
transactions-jdbc-deprecated.jar
mybatis.jar
mybatis-spring.jar
cglib.2.2.2.jar
spring的jar包
 
在Service中,调用事务的方法不能try。。。catch事务的方法,否者不能回滚
如下带面就会出现不会滚问题
Java代码 
try{   
                 userMapper.addUser(user);   
                 roleMapper.addRole(role);   
             }catch(Exception){   
                    
             }  

3. 使用atomikos作分布式事务,连接池超时问题
 2012-11-15

mysql会自动断开超过60秒的连接,而atomikos连接池没有检测机制去保持空闲的连接
造成连接池的连接超时掉了,以下是日志内容
com.mysql.jdbc.jdbc2.optional.MysqlXAException: Communications link failure


The last packet successfully received from the server was 157,969 milliseconds ago.  The last packet sent successfully to the server was 3 milliseconds ago.
at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.mapXAExceptionFromSQLException(MysqlXAConnection.java:604)
at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.dispatchCommand(MysqlXAConnection.java:583)
at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.start(MysqlXAConnection.java:523)
at com.atomikos.datasource.xa.XAResourceTransaction.resume(XAResourceTransaction.java:498)
at com.atomikos.datasource.xa.session.BranchEnlistedStateHandler.<init>(BranchEnlistedStateHandler.java:59)
at com.atomikos.datasource.xa.session.NotInBranchStateHandler.checkEnlistBeforeUse(NotInBranchStateHandler.java:65)
at com.atomikos.datasource.xa.session.TransactionContext.checkEnlistBeforeUse(TransactionContext.java:88)
at com.atomikos.datasource.xa.session.SessionHandleState.notifyBeforeUse(SessionHandleState.java:179)
at com.atomikos.jdbc.AtomikosConnectionProxy.enlist(AtomikosConnectionProxy.java:208)
at com.atomikos.jdbc.AtomikosConnectionProxy.invoke(AtomikosConnectionProxy.java:142)
google下看到几个说修改mysql连接超时设置,我觉得mysql连接超时配置是不建议修改的,有没有更好的方式解决呢

........................................................

spring+mybatis+atomikos 实现JTA事务的更多相关文章

  1. Spring+iBatis+Atomikos实现JTA事务

    Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品. 产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransacti ...

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

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

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

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...

  4. spring+mybatis+Atomikos JTA事务配置说明

    一.概览 Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品.产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTrans ...

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

    本文通过一个demo,介绍如何使用spring+mybatis+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数据源 ...

  6. spring整合atomikos实现分布式事务

    前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...

  7. spring+mybatis之注解式事务管理初识(小实例)

    1.上一章,我们谈到了spring+mybatis声明式事务管理,我们在文章末尾提到,在实际项目中,用得更多的是注解式事务管理,这一章将学习一下注解式事务管理的有关知识.注解式事务管理只需要在上一节的 ...

  8. 在Spring+MyBatis组合中使用事务

     通过Spring和MyBatis的组合,给出一个较为详细的实例 代码清单:配置Spring+MyBatis测试环境 <?xml version='1.0' encoding='UTF-8' ? ...

  9. spring+mybatis+druid+mysql+maven事务配置

    1.首先pom.xml文件里面需要用到的jar配置: <!-- spring事务,包含了@Transactional标注 --> <dependency> <groupI ...

随机推荐

  1. cesium js学习一加载三维模型【转】

    http://blog.csdn.net/tangyajun_168/article/details/50936698 最近项目中用到室外三维模型与室内三维地图交互,室外三维模型的加载我们采用了ces ...

  2. ZMQ和MessagePack的简单使用(转)

    近段日子在做一个比较复杂的项目,其中用到了开源软件ZMQ和MessagePack.ZMQ对底层网络通信进行了封装,是一个消息处理队列库, 使用起来非常方便.MessagePack是一个基于二进制的对象 ...

  3. asp.net 读取word 文档的方法

    资料一:适合读取并显示(简单而明了) 第一种方法:    Response.ClearContent(); Response.ClearHeaders();   Response.ContentTyp ...

  4. Spiral Matrix leetcode java

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  5. Generate Parentheses leetcode java

    题目: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...

  6. CRF分词的纯Java实现

    与基于隐马尔可夫模型的最短路径分词.N-最短路径分词相比,基于随机条件场(CRF)的分词对未登录词有更好的支持.本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用  ...

  7. c#:对两个字符串大小比较(不使用c#/java内部的比较函数),按升序排序

    题目:首先需要实现一个函数:两个字符串大小比较(不得使用c#/java系统函数)的自定义函数:之后对一个字符串数据进行按升序排序(在排序过程中使用字符串大小比较时,使用自定义的字符串大小比较函数). ...

  8. 我的四轴专用PID参数整定方法及原理---超长文慎入(转)

    给四轴调了好久的PID,总算是调好了,现分享PID参数整定的心得给大家,还请大家喷的时候手下留情. 首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么'只 ...

  9. Eclipse关掉项目SVN的链接

    有时候 svn 会导致 eclipse 反应很慢,可以关掉 svn项目信息展现. 1. 点击项目文件夹,右键出现项目信息 2. 选择team项 3. Disconnect.

  10. ESXI部署OVF模板提示用户已取消操作处理方法

    ESXI导出OVF部署到新的ESXI服务器上,Linux主机没有出现用户已取消操作的提示,部署WINDOW虚拟机的时候,提示用户已取消操作,如图: ​首先,要先了解为什么会出现这个问题,原因在于,在做 ...