web xml配置oracle数据源_SpringBoot2 整合JTA组件,多数据源事务管理
一、JTA组件简介
1、JTA基本概念
JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。
XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。
JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中
2、分布式事务
分布式事务(DistributedTransaction)包括事务管理器(TransactionManager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )。
资源管理器是任意类型的持久化数据存储容器,例如在开发中常用的关系型数据库:MySQL,Oracle等,消息中间件RocketMQ、RabbitMQ等。
事务管理器提供事务声明,事务资源管理,同步,事务上下文传播等功能,并且负责着所有事务参与单元者的相互通讯的责任。JTA规范定义了事务管理器与其他事务参与者交互的接口,其他的事务参与者与事务管理器进行交互。
二、SpringBoot整合JTA
项目整体结构图
1、核心依赖
<!--SpringBoot核心依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JTA组件核心依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
2、环境配置
这里jtaManager的配置,在日志输出中非常关键。
spring:jta:transaction-manager-id: jtaManager# 数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedata01:driverClassName: com.mysql.jdbc.DriverdbUrl: jdbc:mysql://localhost:3306/data-oneusername: rootpassword: 000000data02:driverClassName: com.mysql.jdbc.DriverdbUrl: jdbc:mysql://localhost:3306/data-twousername: rootpassword: 000000
3、核心容器
这里两个数据库连接的配置手法都是一样的,可以在源码中自行下载阅读。基本思路都是把数据源交给JTA组件来统一管理,方便事务的通信。
数据源参数
@Component
@ConfigurationProperties(prefix = "spring.datasource.data01")
public class DruidOneParam {private String dbUrl;private String username;private String password;private String driverClassName;
}
JTA组件配置
package com.jta.source.conifg;@Configuration
@MapperScan(basePackages = {"com.jta.source.mapper.one"},sqlSessionTemplateRef = "data01SqlSessionTemplate")
public class DruidOneConfig {private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ;@Resourceprivate DruidOneParam druidOneParam ;@Primary@Bean("dataSourceOne")public DataSource dataSourceOne () {// 设置数据库连接MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();mysqlXADataSource.setUrl(druidOneParam.getDbUrl());mysqlXADataSource.setUser(druidOneParam.getUsername());mysqlXADataSource.setPassword(druidOneParam.getPassword());mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);// 事务管理器AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");return atomikosDataSourceBean;}@Primary@Bean(name = "sqlSessionFactoryOne")public SqlSessionFactory sqlSessionFactoryOne(@Qualifier("dataSourceOne") DataSource dataSourceOne) throws Exception{// 配置Session工厂SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSourceOne);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sessionFactory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));return sessionFactory.getObject();}@Primary@Bean(name = "data01SqlSessionTemplate")public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryOne") SqlSessionFactory sqlSessionFactory) {// 配置Session模板return new SqlSessionTemplate(sqlSessionFactory);}
}
4、测试对比
这里通过两个方法测试结果做对比,在两个数据源之间进行数据操作时,只需要在接口方法加上@Transactional注解即可,这样保证数据在两个数据源间也可以保证一致性。
@Service
public class TransferServiceImpl implements TransferService {@Resourceprivate UserAccount01Mapper userAccount01Mapper ;@Resourceprivate UserAccount02Mapper userAccount02Mapper ;@Overridepublic void transfer01() {userAccount01Mapper.transfer("jack",100);System.out.println("i="+1/0);userAccount02Mapper.transfer("tom",100);}@Transactional@Overridepublic void transfer02() {userAccount01Mapper.transfer("jack",200);System.out.println("i="+1/0);userAccount02Mapper.transfer("tom",200);}
}
三、JTA组件小结
在上面JTA实现多数据源的事务管理,使用方式还是相对简单,通过两阶段的提交,可以同时管理多个数据源的事务。但是暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源,如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。
因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。作为一个轻量级的分布式事务解决方案,在小的系统中还是值得推荐尝试的。
最后作为Java下的API,原理和用法还是值得学习一下,开阔眼界和思路。
web xml配置oracle数据源_SpringBoot2 整合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允许应用程序执行分布式事务处理,即在两个或多个 ...
- web.xml配置的详细说明
web.xml配置的详细说明 (转载)[TOMCAT]用web.xml控制Web应用的行为 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML ...
- 在tomcat下部署两个或多个项目时 log4j和web.xml配置webAppRootKey 的问题(转)
在tomcat下部署两个或多个项目时 web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为"webapp.root",如下: <!-- 应用路径 ...
- sevlet表单处理无法相应问题及web.xml配置.
这几天学习sevlet,对于小白来说配置就是一个很操蛋的事情.有一个很重要的就是路径问题. 首先架构如下: 因为我的test1.html是写在cainiao文件夹里面,如果直接调用action=hel ...
- 160329(二)、web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- 基于注解的Spring MVC(所需jar包,web.xml配置,Spring文件配置,@Controller,@RequestMapping,@RequestParam,model填参,EL取值)
1.添加jar 2.web.xml配置: <?xml version="1.0" encoding="UTF-8"?> <web-app ve ...
- 基于XML配置的Spring MVC(所需jar包,web.xml配置,处理器配置,视图解析器配置)
1.添加jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...
- Tomcat web.xml配置参数详解
Apache Tomcat Configuration Reference - The Context Container https://tomcat.apache.org/tomcat-5.5-d ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在 ...
最新文章
- 高德地图小蓝点_一会晴天一会下雨?夏日想要顺利出行 高德地图这些小功能最实用...
- 浅入深出Vue:文章编辑
- python入门经典书籍知乎_知乎问题回答 - 《Python100天从新手到大师》 - 开源书籍(oscbook.com)...
- Github管理Eclipse分布式项目
- java char character_Java char 与 Character
- 惠普HP LaserJet 1160 驱动
- 单片机C语言字符串转数字
- mysql误删数据快速恢复
- 阿里云服务器地域及可用区的选择问题
- NVIDIA vid2vid论文复现
- gyb优化事项(1)
- Tablayout初始全部不选中,初始默认选中一个,初始全部选中的设置
- 一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
- 电脑突然找不到蓝牙开关了
- 服务器上搭建java环境,安装tomcat以及MySQL数据库-小白教程
- GNU Radio教程1
- 工作交接_java后端
- 【QT线程实现扫描IP和端口】
- matlab 机床,基于MATLAB的数控机床控制系统的设计及仿真
- XCode各版本下载安装
热门文章
- Python--day46--mysql触发器
- mysql的下载及安装(windows)
- 前端每日实战:4# 视频演示如何用纯 CSS 创作一个金属光泽 3D 按钮特效
- 网络安全传输(读书笔记)
- windows搭建virtualbox虚拟机安装的android环境
- Cocos2d-x schedulers 定时器
- eclipse 插件 subclipse plugin 中修改已经登录的帐户密码的方法
- 4006.Cacti集监控IBM刀片服务器温度和风扇运行状态
- .NET Compact Framework 2.0 SP1 发布了
- Android两种获取IP地址的方式(使用WIFI和GPRS)