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

本文介绍了如何在SpringBoot2应用中使用Atomikos JTA组件来实现多数据源事务管理。通过配置JTA组件、设置数据源和事务管理器,以及在服务中使用@Transactional注解,确保跨数据库操作的一致性。尽管JTA带来性能问题,但在小型系统中仍是一个实用的分布式事务解决方案。
摘要由CSDN通过智能技术生成

一、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

项目整体结构图

e85c402f7b492c9330f62a0253f58f3a.png

1、核心依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-jta-atomikos

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,原理和用法还是值得学习一下,开阔眼界和思路。

四、源代码地址

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于快速构建 Java 应用程序的框架。它可以与多种其他框架和组件进行整合,以实现更丰富的功能。在这里,我们将讨论如何使用 Spring Boot 整合 Druid、MyBatis、JTA 分布式事务以及多数据源,同时使用 AOP 注解实现动态切换。 首先,我们可以在 Spring Boot 中集成 Druid 数据源。Druid 是一个高性能的 JDBC 连接池,可以提供监控和统计功能。我们可以通过在 pom.xml 文件中添加相关的依赖,并在 application.properties 文件中配置数据源信息,来实现 Druid 的集成。 接下来,我们可以整合 MyBatis 框架,它是一种优秀的持久化解决方案。我们可以使用 MyBatis 来操作数据库,并将其与 Druid 数据源进行整合。为此,我们需要在 pom.xml 文件中添加 MyBatis 和 MyBatis-Spring 的依赖,并配置 MyBatis 的相关配置文件。 此外,我们还可以使用 JTA(Java Transaction API)实现分布式事务。JTA 可以在分布式环境中协调多个参与者的事务操作。我们可以在 pom.xml 文件中添加 JTA 的依赖,并在 Spring Boot 的配置文件中配置 JTA 的相关属性,以实现分布式事务的支持。 在实现多数据源时,我们可以使用 Spring Boot 的 AbstractRoutingDataSource实现动态切换数据源。这个类可以根据当前线程或其他条件选择不同的数据源来进行数据操作。我们可以通过继承 AbstractRoutingDataSource实现 determineCurrentLookupKey() 方法来指定当前数据源的 key。然后,在配置文件中配置多个数据源,并将数据源注入到 AbstractRoutingDataSource 中,从而实现动态切换。 最后,我们可以使用 AOP(Aspect Oriented Programming)注解来实现动态切换。AOP 是一种编程范式,可以通过在代码中插入特定的切面(Aspect)来实现横切关注点的处理。我们可以在代码中使用注解来标记需要切换数据源的方法,然后使用 AOP 技术来拦截这些方法,并根据注解中指定的数据源信息来进行数据源的切换。 综上所述,通过整合 Druid、MyBatis、JTA 分布式事务以及多数据源,并使用 AOP 注解实现动态切换,我们可以在 Spring Boot 中实现强大而灵活的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值