刚好项目要用到多数据源,在网上查找了很多资料,花了几天的时间对spring、jta 、atomikos、hibernate进行多数据源事务管理的配置。

也可以直接放在tomcat中运行,不过要用ws调用,因为没有做界面,ws入口在controller包里

下面是jta配置文件:

001 <context:annotation-config />
002     <!-- 使用注解的包路径 --> 
003     <context:component-scan base-package="com.rongli.service,com.rongli.dao,com.rongli.controller" />
004     <!-- 支持  @Transactional 标记   -->
005     <tx:annotation-driven transaction-manager="springJTATransactionManager" proxy-target-class="true"/>
006     <!-- 导入cxf配置文件 -->
007     <import resource="ws.cxf.xml"/>
008   
009     <!-- 加载properties配置文件 -->
010     <bean id="propertyConfigurer"
011         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
012         <property name="locations">
013             <list>
014                 <value>classpath:jta.jdbc.properties</value>
015             </list>
016         </property>
017     </bean>
018      
019     <!--公有数据库连接池  -->
020     <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
021         init-method="init" destroy-method="close" abstract="true">
022         <property name="xaDataSourceClassName"
023             value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
024         <property name="poolSize" value="10" />
025         <property name="minPoolSize" value="10" />
026         <property name="maxPoolSize" value="30" />
027         <!--获取连接失败重新获等待最大时间,在这个时间内如果有可用连接,将返回-->
028         <property name="borrowConnectionTimeout" value="60" />
029         <!--最大获取数据时间,如果不设置这个值,Atomikos使用默认的5分钟,
030         那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.-->
031         <property name="reapTimeout" value="20000" />
032         <!-- 最大空闲时间 -->
033         <property name="maxIdleTime" value="60" />
034          <!--连接回收时间-->
035         <property name="maintenanceInterval" value="60" />
036          <!--java数据库连接池,最大可等待获取datasouce的时间-->
037         <property name="loginTimeout" value="60" />
038         <property name="testQuery">
039             <value>select 1</value>
040         </property>
041     </bean>
042      
043     <!-- 客户数据库 -->
044     <bean id="rlc_cus" parent="abstractXADataSource">
045         <property name="uniqueResourceName" value="mysql/rlc_cus" />
046         <property name="xaProperties">
047             <props>
048                 <prop key="URL">${jdbc.rlc_cus.properties}</prop>
049                 <prop key="user">${jdbc.rlc.user}</prop>
050                 <prop key="password">${jdbc.rlc.password}</prop>
051                 <prop key="pinGlobalTxToPhysicalConnection">true</prop>
052             </props>
053         </property>
054     </bean>
055      
056     <!-- 系统数据库 -->
057     <bean id="rlc_sys" parent="abstractXADataSource">
058         <property name="uniqueResourceName" value="mysql/rlc_sys" />
059         <property name="xaProperties">
060             <props>
061                 <prop key="URL">${jdbc.rlc_sys.properties}</prop>
062                 <prop key="user">${jdbc.rlc.user}</prop>
063                 <prop key="password">${jdbc.rlc.password}</prop>
064                 <prop key="pinGlobalTxToPhysicalConnection">true</prop>
065             </props>
066         </property>
067     </bean>
068      
069     <!-- 公有SessionFactory配置 -->
070     <bean id="baseSessionFactory"
071         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
072         abstract="true">
073         <property name="hibernateProperties">
074             <props>
075                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
076                 <prop key="hibernate.show_sql">${hibernate.format_sql}</prop>
077                 <prop key="hibernate.format_sql">${hibernate.show_sql}</prop>
078                 <prop key="javax.persistence.validation.mode">none</prop>
079             </props>
080         </property>
081         <!-- 自动扫描注解方式配置的hibernate类文件 -->
082         <property name="packagesToScan" value="com.rongli.bean"></property>
083     </bean>
084      
085     <!-- sessionFactory配置-->
086     <!-- customer sessionFactory -->
087     <bean id="cusSessionFactory" parent="baseSessionFactory">
088         <property name="dataSource" ref="rlc_cus" />
089     </bean>
090     <!-- system sessionFactory -->
091     <bean id="sysSessionFactory" parent="baseSessionFactory">
092         <property name="dataSource" ref="rlc_sys" />
093     </bean>
094  
095     <!-- atomikos事务管理器 -->
096     <bean id="atomikosTransactionManager"
097         class="com.atomikos.icatch.jta.UserTransactionManager"
098         init-method="init" destroy-method="close">
099         <!-- 调用终止时,强制关闭 -->
100         <property name="forceShutdown">
101             <value>true</value>
102         </property>
103     </bean>
104     <bean id="atomikosUserTransaction"
105         class="com.atomikos.icatch.jta.UserTransactionImp">
106         <property name="transactionTimeout">
107             <value>2000</value>
108         </property>
109     </bean>
110  
111      <!-- spring 事务管理器 -->
112     <bean id="springJTATransactionManager"
113         class="org.springframework.transaction.jta.JtaTransactionManager">
114         <property name="transactionManager">
115             <ref bean="atomikosTransactionManager" />
116         </property>
117         <property name="userTransaction">
118             <ref bean="atomikosUserTransaction" />
119         </property>
120     </bean>
121      
122     <!-- 用于测试,发布到服务器上时删除 -->
123     <bean id="systemServiceImpl"
124         class="com.rongli.service.impl.SystemServiceImpl">
125     </bean>

运行截图:

原2个数据库中都没有数据,图如下:

具体代码:

代码运行成功截图:

成功后数据库(乱码请忽略):

代码故意抛出异常:

代码运行失败:

失败后2个数据库中没有插入(事务回滚了):

Spring JTA多数据源事务管理详细教程相关推荐

  1. atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理

    一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序对JTA ...

  2. SpringBoot2 整合JTA组件,多数据源事务管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...

  3. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

  4. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  5. Spring 注解方式实现 事务管理

    2019独角兽企业重金招聘Python工程师标准>>> 使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间 <beans xmlns="h ...

  6. Spring系列--声明式事务管理

    Spring事务管理概述 Spring的事务管理简化了传统的事务管理流程,并且在一定程序上减少了开发者的工作量. 事务管理的核心接口 在Spring的所有JAR包中包含一个名为Spring-tx-5. ...

  7. spring的annotation-driven配置事务管理器详解

    来源:http://blog.sina.com.cn/s/blog_8f61307b0100ynfb.html 这篇文章是我从ITeye上复制来的,看了一遍,觉得很深刻,决定把他复制来,对原作者表示感 ...

  8. Spring基于Annotation实现事务管理

    在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...

  9. spring配置c3p0连接池、spring的声明式事务管理

    一.spring配置c3p0连接池: 1.导入maven依赖: <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> & ...

最新文章

  1. python找最大值的函数_Python 获取最大值函数
  2. 【数据挖掘】高斯混合模型 ( 与 K-Means 每个步骤对比 | 初始参数设置 | 计算概率 | 计算平均值参数 | 计算方差参数 | 计算高斯分布概率参数 | 算法终止条件 )
  3. 尝试在centos5下运行phantomjs2
  4. 学成在线--10.页面预览
  5. Symbian和C++ SDK开发入门之应用程序
  6. [置顶]       jBPM4工作流开发实战 之 第二部分 jBPM4开发入门
  7. 计算机控制系统步进电机,步进电机计算机控制系统设计.doc
  8. C#的rdlc报表分组汇总学习
  9. 计算机在档案管理出现的问题,浅议档案管理中存在的问题及解决措施_档案管理员资格证...
  10. 正式版苹果雪豹操作系统光盘镜像
  11. domino常用命令大全
  12. js 时间格式Wed Mar 22 13:38:37 CST 2022 转为yyyy-mm-dd
  13. [html] 写一个鼠标跟随的特效
  14. 【问题解决】KeyError: ‘profit‘ raise KeyError(key) from err
  15. 仙剑奇侠传4狐仙打法
  16. DDOS攻击 — 棋牌游戏创业公司的生死劫
  17. IE中的看板管理在软件开发中的应用
  18. 万能视频格式转换器是一款功能强大的全能视频格式转换软件,支持多种视频格式转换。万能视频转换器可以将R...
  19. flash的各种特效实现
  20. ucms通用建站系统php,UCMS通用建站系统

热门文章

  1. 目标检测【Object Detection】
  2. 快应用进入快车道 商家的10亿用户红利期
  3. 大家来找茬游戏助手、外挂的实现
  4. C#普通计算器与科学计算器
  5. 第二周:PSP进度条
  6. ChatGPT为什么可以取代那么多职位?
  7. 计算机上面的音乐,电脑上如何识别音乐
  8. SRPG游戏开发(三十九)第九章 战斗系统 - 一 战斗属性(Combat Properties)
  9. 如何不问冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。
  10. 解决:无法打开文件“GCBase_MD_VC120_v3_0_Basler_pylon_v5_0.lib”