一、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组件,多数据源事务管理相关推荐

  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. web.xml配置的详细说明

    web.xml配置的详细说明 (转载)[TOMCAT]用web.xml控制Web应用的行为 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML ...

  4. 在tomcat下部署两个或多个项目时 log4j和web.xml配置webAppRootKey 的问题(转)

    在tomcat下部署两个或多个项目时 web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为"webapp.root",如下: <!-- 应用路径 ...

  5. sevlet表单处理无法相应问题及web.xml配置.

    这几天学习sevlet,对于小白来说配置就是一个很操蛋的事情.有一个很重要的就是路径问题. 首先架构如下: 因为我的test1.html是写在cainiao文件夹里面,如果直接调用action=hel ...

  6. 160329(二)、web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  7. 基于注解的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 ...

  8. 基于XML配置的Spring MVC(所需jar包,web.xml配置,处理器配置,视图解析器配置)

    1.添加jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...

  9. Tomcat web.xml配置参数详解

    Apache Tomcat Configuration Reference - The Context Container https://tomcat.apache.org/tomcat-5.5-d ...

  10. Spring MVC的web.xml配置详解(转)

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name)  2.在 ...

最新文章

  1. 高德地图小蓝点_一会晴天一会下雨?夏日想要顺利出行 高德地图这些小功能最实用...
  2. 浅入深出Vue:文章编辑
  3. python入门经典书籍知乎_知乎问题回答 - 《Python100天从新手到大师》 - 开源书籍(oscbook.com)...
  4. Github管理Eclipse分布式项目
  5. java char character_Java char 与 Character
  6. 惠普HP LaserJet 1160 驱动
  7. 单片机C语言字符串转数字
  8. mysql误删数据快速恢复
  9. 阿里云服务器地域及可用区的选择问题
  10. NVIDIA vid2vid论文复现
  11. gyb优化事项(1)
  12. Tablayout初始全部不选中,初始默认选中一个,初始全部选中的设置
  13. 一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
  14. 电脑突然找不到蓝牙开关了
  15. 服务器上搭建java环境,安装tomcat以及MySQL数据库-小白教程
  16. GNU Radio教程1
  17. 工作交接_java后端
  18. 【QT线程实现扫描IP和端口】
  19. matlab 机床,基于MATLAB的数控机床控制系统的设计及仿真
  20. XCode各版本下载安装

热门文章

  1. Python--day46--mysql触发器
  2. mysql的下载及安装(windows)
  3. 前端每日实战:4# 视频演示如何用纯 CSS 创作一个金属光泽 3D 按钮特效
  4. 网络安全传输(读书笔记)
  5. windows搭建virtualbox虚拟机安装的android环境
  6. Cocos2d-x schedulers 定时器
  7. eclipse 插件 subclipse plugin 中修改已经登录的帐户密码的方法
  8. 4006.Cacti集监控IBM刀片服务器温度和风扇运行状态
  9. .NET Compact Framework 2.0 SP1 发布了
  10. Android两种获取IP地址的方式(使用WIFI和GPRS)