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.DruidDataSource
  data01:
   driverClassName: com.mysql.jdbc.Driver
   dbUrl: jdbc:mysql://localhost:3306/data-one
   username: root
   password: 000000
  data02:
   driverClassName: com.mysql.jdbc.Driver
   dbUrl: jdbc:mysql://localhost:3306/data-two
   username: root
   password: 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) ;

  @Resource
  private 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 {

  @Resource
  private UserAccount01Mapper userAccount01Mapper ;

  @Resource
  private UserAccount02Mapper userAccount02Mapper ;

  @Override
  public void transfer01() {
    userAccount01Mapper.transfer("jack",100);
    System.out.println("i="+1/0);
    userAccount02Mapper.transfer("tom",100);
  }

  @Transactional
  @Override
  public void transfer02() {
    userAccount01Mapper.transfer("jack",200);
    System.out.println("i="+1/0);
    userAccount02Mapper.transfer("tom",200);
  }
}

三、JTA组件小结

在上面JTA实现多数据源的事务管理,使用方式还是相对简单,通过两阶段的提交,可以同时管理多个数据源的事务。但是暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源,如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。

因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。作为一个轻量级的分布式事务解决方案,在小的系统中还是值得推荐尝试的。

最后作为Java下的API,原理和用法还是值得学习一下,开阔眼界和思路。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

到此这篇关于SpringBoot2整合JTA组件实现多数据源事务管理的文章就介绍到这了,更多相关SpringBoot2 JTA多数据源事务管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 五分钟教你手写 SpringBoot 本地事务管理实现

    白菜Java自习室 涵盖核心知识 1. SpringBoot 事务 一直在用 SpringBoot 中的 @Transactional 来做事务管理,但是很少没想过 SpringBoot 是如何实现事务管理的,今天从源码入手,看看 @Transactional 是如何实现事务的,最后我们结合源码的理解,自己动手写一个类似的注解来实现事务管理,帮助我们加深理解. 1.1. 事务的隔离级别 事务为什么需要隔离级别呢?这是因为在并发事务情况下,如果没有隔离级别会导致如下问题: 脏读 (Dirty Re

  • 详解Springboot事务管理

    在Spring Boot事务管理中,实现自接口PlatformTransactionManager. public interface PlatformTransactionManager { org.springframework.transaction.TransactionStatus getTransaction(org.springframework.transaction.TransactionDefinition transactionDefinition) throws org.

  • springboot中事务管理@Transactional的注意事项与使用场景

    前言:在service层的方法上使用@Transactional 即可实现处理数据库发生错误时触发事务回滚机制. 注意: Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException及其子类)和 Error 进行回滚. 数据库引擎要支持事物,使用InnoDB. @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没

  • 详解SpringBoot的事务管理

    Springboot内部提供的事务管理器是根据autoconfigure来进行决定的. 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后. Springboot会构造一个JpaTransactionManager这个事务管理器. 而当我们使用spring-boot-starter-jdbc的时候,构造的事务管理器则是DataSourceTransactionManager. 这2个事务管理器都实现了spring中提供的Pl

  • springboot jta atomikos实现分布式事物管理

    这篇文章主要介绍了springboot jta atomikos实现分布式事物管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当项目在连接多个数据库时可能会发生事务问题,即一个库的事务不可能去操作另一个数据库的事务,这时就需要使用atomikos对数据库的事务进行统一的管理 第一步添加atomikos的依赖 <dependency> <groupId>org.springframework.boot</groupId&g

  • SpringBoot2整合JTA组件实现多数据源事务管理

    一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序对JTA的支持极大地增强了数据访问能力. XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能. JTA事务比JDBC事务更强大.一个JTA事务可以有多个参与者,而一个JD

  • SpringBoot2使用JTA组件实现基于JdbcTemplate多数据源事务管理(亲测好用)

    目录 一.JTA组件简介 什么是JTA 什么是XA协议 二.SpringBoot整合JTA 1.核心依赖 2.环境配置 3.jta组件配置类 4.创建一个Service实现,模拟两种不同的情况. 5.创建测试类,编写测试用例 6.测试验证 一.JTA组件简介 什么是JTA JTA,全称:Java Transaction API.JTA事务比JDBC事务更强大.一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接.所以,当我们在同时操作多个数据库的时候,使用JTA事务就

  • SpringBoot2 整合Ehcache组件,轻量级缓存管理的原理解析

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认的缓存提供方. 2.Hibernate缓存 Hibernate三级缓存机制简介: 一级缓存:基于Session级别分配一块缓存空间,缓存访问的对象信息.Session关闭后会自动清除缓存. 二级缓存:是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是

  • SpringBoot2整合Ehcache组件实现轻量级缓存管理

    目录 一.Ehcache缓存简介 Hibernate缓存 EhCache缓存特点 对比Redis缓存 二.集成SpringBoot框架 1.核心依赖 2.加载配置 3.配置详解 三.注解用法 四.源代码地址 一.Ehcache缓存简介 Hibernate缓存 Hibernate三级缓存机制简介: 一级缓存:基于Session级别分配一块缓存空间,缓存访问的对象信息.Session关闭后会自动清除缓存. 二级缓存:是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享

  • SpringBoot2 整合Nacos组件及环境搭建和入门案例解析

    目录 一.Nacos基础简介 1.概念简介 2.关键特性 3.专业术语解释 4.Nacos生态圈 二.Nacos环境搭建 1.环境版本 2.环境包下载 3.启动环境启动文件地址: 三.整合SpringBoot2 1.新建配置 2.核心依赖 3.Yml配置文件 4.启动类配置 5.核心配置类 6.基础API用例 四.源代码地址 本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以“服务”为中心的现代应用架构,如微服务范式.云原生范式等

  • springboot-jta-atomikos多数据源事务管理实现

    目录 背景 源码地址 项目目录结构 实现 1.添加依赖pom.xml 2.配置数据库连接信息application.properties 3.创建多数据源DBAtomikosConfig.java 4.测试事务类TestAtomikos.java 5.测试SpringbootAtomikosApplicationTests.java 测试结果 背景 我们平时在用springboot开发时,要使用事务,只需要在方法上添加@Transaction注解即可,但这种方式只适用单数据源,在多数据源下就不再

  • SpringBoot整合Mybatis实现多数据源配置与跨数据源事务实例

    目录 Pom依赖 application.yml 多数据源配置 MasterDataSourceConfig ClusterDataSourceConfig 启动类 使用 实现跨数据源事务 Pom依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.

  • springboot整合shardingsphere和seata实现分布式事务的实践

    各个框架版本信息 springboot: 2.1.3 springcloud: Greenwich.RELEASE seata: 1.0.0 shardingsphere:4.0.1 maven 依赖        <dependency>         <!--<groupId>io.shardingsphere</groupId>-->         <groupId>org.apache.shardingsphere</group

  • Spring与Hibernate整合事务管理的理解

    在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: xml代码 <property name="def

  • Spring Boot多数据源及其事务管理配置方法

    准备工作 先给我们的项目添加Spring-JDBC依赖和需要访问数据库的驱动依赖. 配置文件 spring.datasource.prod.driverClassName=com.mysql.jdbc.Driver spring.datasource.prod.url=jdbc:mysql://127.0.0.1:3306/prod spring.datasource.prod.username=root spring.datasource.prod.password=123456 spring

随机推荐