使用spring+atomikos+ibatis实现声明式DB2多数据库全局分布式事务,关键是DB2数据库驱动程序和数据库访问参数的配置。db2的jdbc driver有好几种,不同的driver,参数的写法也不同,甚至端口也不一样,而且本人使用的DB2 V8.2驱动程序db2jcc.jar有bug,必须使用fp12版本的db2jcc.jar代替,才能实现全局分布式事务
atomikos官网上没有提供DB2的配置示例,试了多次,以下配置终于搞定了全局分布式事务,见其中的注释
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<!-- 在类foo.bar.MyClass的myMethod()方法里实现全局分布式事务,该方法对两个数据源进行操作 -->
<aop:config>
<aop:pointcut id="myOperation"
expression="execution(*foo.bar.MyClass.myMethod(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="myOperation" />
</aop:config>
<!-- 数据源1 -->
<bean id="dataSource"
class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName">
<value>app/main</value>
</property>
<property name="xaDataSourceClassName">
<value>[b]com.ibm.db2.jcc.DB2XADataSource[/b]</value>
</property>
<property name="xaProperties">
<props>
[b]<prop key="serverName">172.160.1.138</prop>
<prop key="portNumber">50000</prop>
<prop key="databaseName">MYDB</prop>
<prop key="user">db2admin</prop>
<prop key="password">pass</prop>
<prop key="driverType">4</prop>[/b]
</props>
</property>
<property name="poolSize">
<value>5</value>
</property>
</bean>
<!-- 数据源2 -->
<bean id="dataSourceHis"
class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName">
<value>app/history</value>
</property>
<property name="xaDataSourceClassName">
<value>com.ibm.db2.jcc.DB2XADataSource</value>
</property>
<property name="xaProperties">
<props>
<prop key="serverName">172.160.1.139</prop>
<prop key="portNumber">50000</prop>
<prop key="databaseName">NDB</prop>
<prop key="user">db2admin</prop>
<prop key="password">pass</prop>
<prop key="driverType">4</prop>
</props>
</property>
<property name="poolSize">
<value>5</value>
</property>
</bean>
<!-- 数据源1的iBatis sqlMapClient -->
<bean id="sqlMapClient1"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- 数据源2的iBatis sqlMapClient -->
<bean id="sqlMapClient2"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSourceHis" />
</property>
</bean>
<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="240" />
</bean>
<bean id="txManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
</bean>
<-- 访问数据源1的dao -->
<bean id="dao1" class="foo.bar.dao.My1DAOImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<-- 访问数据源2的dao -->
<bean id="dao2" class="foo.bar.dao.My2DAOImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClientHis" />
</property>
</bean>
iBatis的配置没有特殊的地方,使用abator for iBatis自动生成,abatorConfig.xml里daoGenerator的type属性设置为'SPRING'
分享到:
相关推荐
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
spring + JTA + atomikos实现分布式事务, 高大上的技术
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理
spring+hibernate+atomikos实现多数据源分布式事务管理
NULL 博文链接:https://tws502934462.iteye.com/blog/1186912
本用例基于 Spring Boot + Druid + Mybatis 配置多数据源,并采用 JTA 实现分布式事务。
这是一个使用Spring+druid+atomikos的分布式事务demo,若有错误请指出
NULL 博文链接:https://injavawetrust.iteye.com/blog/2308552
将基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理,通过AOP面向切面实现动态实现数据源的切换 http://www.dczou.com/viemall/407.html
多数据源,实现分布式事务管理,基于Spring+SpringMVC+MyBatis+Atomikos框架
Spring+Mybatis+Atomikos实现JAVA初始化并控制多个数据源+分布式事务的一个DEMO,内涵源代码,以及一篇关于该内容的博客
Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理(demo项目),想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果...
springboot+jta+atomikos Springboot+atomikos+jta实现分布式事务统一管理
spring 3.2+ jpa 1.1+ atomikos3.9 配置mysql+sqlserver2000多数据源 包含所需所有jar包,完整项目
springboot+Atomikos+jpa+mysql的JTA分布式事务实现,本案例涉及到2个数据库,预期结果,在同一个事务中,两个库的状态一致
基于若依项目改造的多模块分布式事务,使用了atomikos进行分布式事务的管理。
spring 3.2+ hibernate 3.* +atomikos3.9 配置多数据源 包含所有jar包和源代码,完整项目
SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式 SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式