Spring3+后不再对JTOM提供支持,所以可以改用Atomikos管理多数据源事务。
Spring2.5+Hibernate3+JTOM参考:http://hanqunfeng.iteye.com/blog/1554251
Atomikos官网网站:http://www.atomikos.com/
一.pom.xml
<dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc</artifactId> <version>3.9.3</version> </dependency>
二.applicationContext-atomikos.xml
<bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="dataSource01"> <!-- Set unique name for this DataSource --> <property name="uniqueResourceName"><value>oracle</value></property> <!-- Set XADatasource class name --> <property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource" /> <property name="xaProperties"> <props> <prop key="user">${jdbc.username01}</prop> <prop key="password">${jdbc.password01}</prop> <prop key="URL">${jdbc.url01}</prop> </props> </property> <!-- set properties for datasource connection pool --> <property name="poolSize" value="3" /> <!-- timeout after 20000 seconds --> <property name="reapTimeout"><value>20000</value></property> </bean> <bean id="sessionFactory01" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource01" /> <property name="packagesToScan"> <list> <value>com.cpframework.function.**.model.oracle</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle10gDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.current_session_context_class">jta</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop> </props> </property> </bean> <!-- oracleDAO --> <bean id="hibernateDAO01" class="org.cpframework.dao.hibernate4.CP_Hibernate4DAOImpl"> <property name="sessionFactory" ref="sessionFactory01"></property> </bean> <bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="dataSource02"> <!-- Set unique name for this DataSource --> <property name="uniqueResourceName"><value>mysql</value></property> <!-- Set XADatasource class name --> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /> <property name="xaProperties"> <props> <prop key="user">${jdbc.username02}</prop> <prop key="password">${jdbc.password02}</prop> <prop key="URL">${jdbc.url02}</prop> </props> </property> <!-- set properties for datasource connection pool --> <property name="poolSize" value="3" /> <property name="reapTimeout"><value>20000</value></property> </bean> <bean id="sessionFactory02" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource02" /> <property name="packagesToScan"> <list> <value>com.cpframework.function.**.model.mysql</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.current_session_context_class">jta</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop> </props> </property> </bean> <!-- mysqlDAO --> <bean id="hibernateDAO02" class="org.cpframework.dao.hibernate4.CP_Hibernate4DAOImpl"> <property name="sessionFactory" ref="sessionFactory02"></property> </bean> <!-- atomikos事务管理器 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <description>UserTransactionManager</description> <property name="forceShutdown"> <value>true</value> </property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300" /> </bean> <!-- spring 事务管理器 --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction" /> <property name="allowCustomIsolationLevels" value="true"/> </bean> <aop:config proxy-target-class="true"> <aop:pointcut id="servicePoint" expression="execution (* com.cpframework.function.*.service.*.*Service*.*(..))" /> <aop:advisor pointcut-ref="servicePoint" id="txAdvisor" advice-ref="defaultTxAdvice" /> </aop:config> <tx:advice id="defaultTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="find*" read-only="true" /> <tx:method name="get*" read-only="true" /> <tx:method name="query*" read-only="true" /> <tx:method name="load*" read-only="true" /> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="apply*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="handle*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="do*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice>
三.transactions.properties
将transactions.properties文件放到编译根路径下,可根据需要开启相关注解,参见附件。
四.CP_Hibernate4DAOImpl
需要注意两点:
1.session必须使用sessionFactory.openSession()的方式获得,不能使用sessionFactory.getCurrentSession()。
2.更新操作必须调用session.flush()方法。
例如:
public void update(Object entity) { Session session = sessionFactory.openSession(); session.update(entity); session.flush(); }
参考:
相关推荐
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
spring 3.2+ hibernate 3.* +atomikos3.9 配置多数据源 包含所有jar包和源代码,完整项目
spring+hibernate+atomikos实现多数据源分布式事务管理
本用例基于 Spring Boot + Druid + Mybatis 配置多数据源,并采用 JTA 实现分布式事务。
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
spring+hibernate+jta 分布式事务管理Demo源码(无jar包) 博文链接:https://momoko8443.iteye.com/blog/190994
SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo,两条数据源,是满足事务唯一性的,看清楚是demo
SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式 SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式
springboot+Atomikos+jpa+mysql的JTA分布式事务实现,本案例涉及到2个数据库,预期结果,在同一个事务中,两个库的状态一致
springboot+mybatis+jta+atomikos解决多数据源事务问题
使用springboot+jta+atomikos来配置多数据源下的事务分布管理 里面带有sql语句.直接下载下来,并且运行sql就可以测试运行
spring 3.2+ jpa 1.1+ atomikos3.9 配置mysql+sqlserver2000多数据源 包含所需所有jar包,完整项目
基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理
多数据源,实现分布式事务管理,基于Spring+SpringMVC+MyBatis+Atomikos框架
NULL 博文链接:https://tangshuo.iteye.com/blog/1989830
2 different databases with different user to demo the JTA tech of Atomikos
mybatis+mysql+springmvc + multidatasource+Atomikos 多数据源 (可以跑通的) http://knight-black-bob.iteye.com/blog/2253726
springboot+mybatis+druid+atomikos 多数据源,分布式事务,集成websocket,redis,swagger2
基于若依项目改造的多模块分布式事务,使用了atomikos进行分布式事务的管理。