spring+mybatis+atomikos 实现JTA事务
来源:互联网 发布:php curl 发送get请求 编辑:程序博客网 时间:2024/05/09 03:38
看到了一篇介绍mybatis实现JTA事务的文章,觉得很有必要缓存一下,留作参考,辛苦原作者,转载地址如下:
http://my.oschina.net/baowenke/blog/99814
atomikos支持一个分布式事务,结合spring,可以很好的满足一个应用访问多个库的需要。
atomikos 结合spring做配置也很简单
1.配置datasource
<!-- 第一个数据库 --> <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
<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 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
<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的管理及注入
<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下面
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactorycom.atomikos.icatch.console_file_name = tm.outcom.atomikos.icatch.log_base_name = tmlogcom.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tmcom.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事务的方法,否者不能回滚
如下带面就会出现不会滚问题
try{ userMapper.addUser(user); roleMapper.addRole(role);}catch(Exception){ }当然也可以不用mybatis,个人喜欢用Spring JdbcTemplate
0 0
- spring+mybatis+atomikos 实现JTA事务
- spring+mybatis+Atomikos JTA事务配置说明
- spring+mybatis+Atomikos JTA事务配置说明
- spring+mybatis+Atomikos JTA事务配置说明
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- spring+ibatis+Atomikos实现JTA事务
- Atomikos+spring AOP方式实现JTA事务配置的示例
- Postgresql 分布式事务JTA实现Atomikos与Spring集成实践
- Spring JTA接口+Atomikos实现申明式分布式事务控制
- Spring全局事务之JTA+Atomikos
- 分布式事务JTA之实践:Spring+ATOMIKOS
- SQL Server清空库下所有表数据
- 文档生成模型:多元贝努利分布vs多项式分布
- Log4j学习笔记
- php面向对象(OOP)—调用成员和方法
- android获取IP地址和MAC地址的方法
- spring+mybatis+atomikos 实现JTA事务
- Mysql数据库优化总结
- MyBatis Generator工具的使用
- soap RMI RPC WebService REST CORBA JMS这几者的区别和联系
- IM
- Eclipse程序打包
- MySQL慢查询优化
- wamp开发环境配置之配置Apache虚拟主机
- activemq的几种基本通信方式总结