Spring JTA多数据源事务管理详细教程
刚好项目要用到多数据源,在网上查找了很多资料,花了几天的时间对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多数据源事务管理详细教程相关推荐
- atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理
一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序对JTA ...
- SpringBoot2 整合JTA组件,多数据源事务管理
本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理(转)
摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- Spring 注解方式实现 事务管理
2019独角兽企业重金招聘Python工程师标准>>> 使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间 <beans xmlns="h ...
- Spring系列--声明式事务管理
Spring事务管理概述 Spring的事务管理简化了传统的事务管理流程,并且在一定程序上减少了开发者的工作量. 事务管理的核心接口 在Spring的所有JAR包中包含一个名为Spring-tx-5. ...
- spring的annotation-driven配置事务管理器详解
来源:http://blog.sina.com.cn/s/blog_8f61307b0100ynfb.html 这篇文章是我从ITeye上复制来的,看了一遍,觉得很深刻,决定把他复制来,对原作者表示感 ...
- Spring基于Annotation实现事务管理
在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...
- spring配置c3p0连接池、spring的声明式事务管理
一.spring配置c3p0连接池: 1.导入maven依赖: <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> & ...
最新文章
- python找最大值的函数_Python 获取最大值函数
- 【数据挖掘】高斯混合模型 ( 与 K-Means 每个步骤对比 | 初始参数设置 | 计算概率 | 计算平均值参数 | 计算方差参数 | 计算高斯分布概率参数 | 算法终止条件 )
- 尝试在centos5下运行phantomjs2
- 学成在线--10.页面预览
- Symbian和C++ SDK开发入门之应用程序
- [置顶] jBPM4工作流开发实战 之 第二部分 jBPM4开发入门
- 计算机控制系统步进电机,步进电机计算机控制系统设计.doc
- C#的rdlc报表分组汇总学习
- 计算机在档案管理出现的问题,浅议档案管理中存在的问题及解决措施_档案管理员资格证...
- 正式版苹果雪豹操作系统光盘镜像
- domino常用命令大全
- js 时间格式Wed Mar 22 13:38:37 CST 2022 转为yyyy-mm-dd
- [html] 写一个鼠标跟随的特效
- 【问题解决】KeyError: ‘profit‘ raise KeyError(key) from err
- 仙剑奇侠传4狐仙打法
- DDOS攻击 — 棋牌游戏创业公司的生死劫
- IE中的看板管理在软件开发中的应用
- 万能视频格式转换器是一款功能强大的全能视频格式转换软件,支持多种视频格式转换。万能视频转换器可以将R...
- flash的各种特效实现
- ucms通用建站系统php,UCMS通用建站系统
热门文章
- 目标检测【Object Detection】
- 快应用进入快车道 商家的10亿用户红利期
- 大家来找茬游戏助手、外挂的实现
- C#普通计算器与科学计算器
- 第二周:PSP进度条
- ChatGPT为什么可以取代那么多职位?
- 计算机上面的音乐,电脑上如何识别音乐
- SRPG游戏开发(三十九)第九章 战斗系统 - 一 战斗属性(Combat Properties)
- 如何不问冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。
- 解决:无法打开文件“GCBase_MD_VC120_v3_0_Basler_pylon_v5_0.lib”