SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))

springboot实现mybatis分布式事务(atomikos) 背景:项目中使用了两个mysql数据源,有一个功能是同时修改两个库里的表数据,需要进行事务控制。项目框架为springcloud+mybatis。 项目结构如下 增加maven依赖 <!--分布式事务支持--> <dependency> <groupId>org.springframework.boot</groupId> ... 阅读详情

快速集成工具,欢迎打脸

说明

适用环境:SpringBoot / MyBatis / Atomickos 
特性:

  1. 多数据源,动态切换
  2. 多数据源,XA分布式事务支持(需引入Atomickos) 

仅支持Mybatis,采用AbstractRoutingDataSource实现数据源动态切换。 引入Atomickos分布式事务,可支持多数据源动态切换分布式事务。

使用方法

引入jar包依赖 maven:

      <dependency>
        <groupId>com.tomz</groupId>
        <artifactId>xatomic</artifactId>
        <version>1.0.0</version>
      </dependency>

gradle:

implementation 'com.tomz:xatomic:1.0.0'

使用注解切换数据源@DynamicDataSource,可以放在类或者方法上。

  • 多数据源功能 
    配置文件示例:对于name属性,当数据源集合中存在name=default的数据源时,该数据源作为默认数据源 ,不加@DynamicDataSource默认使用该数据源,否则取集合中的第一个数据源作为默认数据源

      spring:
          datasources:
            - name: ds1
              type: com.zaxxer.hikari.HikariDataSource
              username: root
              password:
              driver-class-name: com.mysql.cj.jdbc.Driver
              jdbcUrl: jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true&&serverTimezone=GMT%2B8
            - name: ds2
              type: com.zaxxer.hikari.HikariDataSource
              username: root
              password:
              driver-class-name: com.mysql.cj.jdbc.Driver
              jdbcUrl: jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true&&serverTimezone=GMT%2B8
    
  • 多数据源XA分布式事务支持 
    引入: implementation 'org.springframework.boot:spring-boot-starter-jta-atomikos' 配置文件与多数据源配置文件相似,但是数据源类型type需要改为支持XA的数据源对象, 如:MysqlXADataSource,DruidXADataSource。 需要注意的是,对于DruidXADataSource,支持的MySql驱动类型当前只到8.0.11版本。

     spring:
         datasources:
           - name: ds1
             type: com.mysql.cj.jdbc.MysqlXADataSource
             databaseName: test01
             hostName: localhost
             user: root
             password:
             port: 3306
             url: jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true&&serverTimezone=GMT%2B8
           - name: ds2
             type: com.mysql.cj.jdbc.MysqlXADataSource
             databaseName: test01
             hostName: localhost
             user: root
             password:
             port: 3306
             url: jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true&&serverTimezone=GMT%2B8
    

    此外还可以对Atomickos做配置

     # JtaProperties
     spring.jta:
     #  logDir:
       transactionManagerId: myTxMgrId
       # AtomikosProperties
     #  atomikos:
     #    properties:
       # org.springframework.boot.jta.atomikos.AtomikosDataSourceBean 数据源连接池配置
       atomikos:
         datasource:
           poolSize: 5
           minPoolSize: 3
           maxPoolSize: 20
           borrowConnectionTimeout: 60
           reapTimeout: 300
           maxIdleTime: 60
           maintenanceInterval: 60
           loginTimeout: 60
           testQuery: select 1
    

    最后,需要在Configuration类上面使用MapperScan注解,如下:

     //factoryBean替换掉默认的MapperFactoryBean,实现Mapper映射到每个数据源。仅使用xa分布式事务支持才需要添加该注解,否则只用多数据源功能可以不加
     @MapperScan(factoryBean = XaDynamicMapperFactoryBean.class, basePackages = {"com.test.mapper"}) 
     @SpringBootApplication 
     class ApplicationDemo { 
        public static void main(String[] args) {
        		SpringApplication.run(ApplicationDemo.class, args);
        	}   
     }
     //mapper类
     @Mapper
     public interface TestMapper {  
         @DynamicDataSource("ds1")
         @Insert("insert into test(name) values ('a')")
         long insertA();
     
         @DynamicDataSource("ds2")
         @Insert("insert into test(name) values ('b')")
         long insertB();
     }
     //service类
     @Service
     class ServiceA {
           @Autowired
           private TestMapper mapper;
           @Transactional(rollbackFor = Exception.class)
           public void insertAB() {
               this.mapper.insertA();
               this.mapper.insertB();
               //throw new IllegalArgumentException("test xa-rollback");
           }
     }
     //测试类
     @RunWith(SpringRunner.class)
     @SpringBootTest
     public class ServiceTest {
     
         @Autowired
         private ServiceA service;
     
         @Test
         public void testXa() {
             this.service.insertAB();
         }
     
     }
    

    禁用分布式事务数据源:spring.jta.enabled=false 
    禁用动态多数据源:spring.dynamic.datasouce.enabled=false

    备注:该项目需要自己下载到本地,执行install安装到本地才能引用。?

    $ git clone https://gitee.com/t0mZ/xatomic.git
    Initialized empty Git repository in D:/java/xatomic/.git/
    remote: Enumerating objects: 69, done.
    remote: Counting objects: 100% (69/69), done.
    remote: Compressing objects: 100% (56/56), done.
    remote: Total 69 (delta 19), reused 0 (delta 0)
    Unpacking objects: 100% (69/69), done.
    $ cd xatomic
    $ ./gradlew install
    Downloading https://services.gradle.org/distributions/gradle-4.10.3-all.zip
    ................................................................................................................
    Unzipping /home/.gradle/wrapper/dists/gradle
    ...省略....
    > Task :compileJava
    Note: Some input files use unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    
    BUILD SUCCESSFUL in 2m 15s
    4 actionable tasks: 4 executed

 

  • 默认安装在:${user.dir}/.m2/repository/com/tomz/xatomic/

3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。        下面列举两种常用的场景:         一种是读写分离的数据源,例如一个读库和一个写库,读库负责各种查询操作,写库负责各种添加、修改、删除。        另一种是多个数据源之间并没有特别明显的操作,只是程序在一个流程中可能需要同时从A数据源和B数据源中取数据或 阅读详情

相关推荐

Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理

想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果发现,网上的文章要么版本太老有些过时,要么用的不是mybatis-plus而是mybaits,要么步骤繁琐、需要自己手动编写aop切面代码,要么在同一service层方法中只能使用@Transactional实现单个数据源的事务管理控制,总是觉得有点不太完美,所以综合了以上文章的不足之处和可以借鉴之处,在这里总结出了一个万能的、可以适应多方面需求的多数据源配置方法,以满足相对完整的、代码简练的分布式事务控制需求。 一.

朗朗繁星的博客 1543

SpringMVC+MyBatis+JMS+JTA(分布式事务)

SpringMVC+MyBatis 相信已经是现在企业开发中常用技术了。 因为一些需求,我们需要集成JMS(我使用的是ActiveMQ),大家应该都知道,MQ也可以认为是一个数据源,数据也是数据源。这种情况下,如果我们在一个方法内操作JMS和数据库,我们就需要保证这个方法执行需要满足原子性。 这也就意味这一个问题,我们要多个数据源在...

weixin_34378969的博客 356

SpringBoot+Mybatis配置多数据源及事务方案

可能由于业务上的某些需求,我们的系统中有时往往要连接多个数据库,这就产生了多数据源问题。多数据源的情况下,一般我们要做到可以自动切换,此时会涉及到事务注解 Transactional 不生效问题和分布式事务问题。关于多数据源方案,笔者在网上看过一些例子,然而大部分都是错误示例,根本跑不通,或者没办法兼容事务。今天,我们就一点点来分析这些问题产生的根源和相应的解决方法。本文通过引入SpringBoot+Mybatis的多数据源场景,分析了如下问题:多数据源的配置和实现;

程序员高级码农的博客 3015

spring boot 分布式事务实现(XA方式)

关于spring boot 支持分布式事务,XA是常用的一种方式。 这里把相关的配置记下,方便以后使用。 首先配置两个不同的数据源 : 订单库、持仓库。 /** * Created by zhangjunwei on 2017/8/2. */ @Configuration public class DataSourceConfig { /** *...

weixin_30243533的博客 1017

springboot+mybatisplus+jta atomikos多数据源配置

背景 需要对两个独立的数据库进行读写操作,存在分布式事务问题,所以使用了jta atomikos进行多数据源的事务管理 必要的依赖包及版本 ‘com.baomidou:mybatis-plus:3.3.2’ ‘mysql:mysql-connector-java:6.0.6’ druid-spring-boot-starter’, version: ‘1.1.21’ spring-boot-starter-jta-atomikos’, version: ‘2.1.6.RELEASE’ 配置文件 使用不

KKALL1314的博客 2341

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

在最近的实际开发的过程中,遇到了在多数据源的情况下要保证原子性的问题,这个问题当时遇到了也是思考了一段时间,后来通过搜集大量资料与学习,最后是采用了分布式事务来解决这个问题,在讲解之前,在我往期的博客提前搭好了一个SpringBoot整合MyBatis搭建MySQL多数据源的教程,本篇博客我是在原有的这个项目的基础之上进行的改造,主要新增了几个配置项进行实现的,大家可以先简单的看一下这篇文章!

黄团团的个人博客 2699

MyBatis的多数据源与分布式事务

1.背景介绍 MyBatis是一款流行的Java数据访问框架,它可以简化数据库操作并提高开发效率。在实际应用中,我们经常需要处理多数据源和分布式事务。在本文中,我们将讨论MyBatis的多数据源与分布式事务,并提供一些最佳实践和技巧。 1.背景介绍 在现代应用中,我们经常需要处理多个数据源,以实现高性能和高可用性。同时,分布式事务是一种在多个数据源之间实现原子性的方法。MyBatis提供了一...

AI天才研究院 1184

spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

文章目录一、综述1.1 项目说明1.2 项目结构二、配置多数据源并支持分布式事务2.1 导入基本依赖2.2 在yml中配置多数据源信息2.3 进行多数据源的配置1. 在启动类关闭springboot对数据源的自动化配置,由我们手动进行多数据源的配置2. 创建多数据源配置类`DataSourceFactory.java`, 手动配置多数据源3. 自定义sqlSessionTemplate的...

黑白影的博客 9018

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

3dMax效率翻倍!用Octopus章鱼插件打造你的专属快捷菜单(附MaxScript入门指南)

本文详细介绍了如何利用Octopus插件和MaxScript脚本在3dMax中打造高效快捷菜单,显著提升三维建模与动画制作的工作效率。通过饼状菜单系统、自动化宏录制和脚本控制,用户可实现个性化工作流,节省大量操作时间。文章还提供了MaxScript入门指南,帮助开发者快速掌握这一强大工具。

weixin_30920853的博客 152

springboot+mybatis+druid+atomikos解决动态多数据源并支持事务

一、项目说明 本用例基于springboot+mybatis+druid+atomikos 配置动态多数据源,实现分布式事务。源码仓库地址:https://github.com/lishuangqi/springboot-mybatis-druid-atomikos 根据网上的搭建始终没实现atomikos分布式事务,经过两天网上查询资料终于实现了。刚开始分布式事务加入后,多数据源切换不...

nicklsq的专栏 4762

SCCM实战指南:从零搭建企业级Windows自动化部署平台

本文提供了一份详细的SCCM实战指南,手把手教你从零搭建企业级Windows自动化部署平台。内容涵盖环境规划、AD架构扩展、SQL Server配置、SCCM主站点安装,以及最终实现操作系统镜像的自动化部署,旨在帮助IT管理员彻底告别手动装机,实现高效、规范的Windows设备批量管理。

weixin_29251337的博客 638

分布式事务JTA/XA atomikos -- 基于springboot的Dubbo + 动态数据源 + mybatis-plus

本文code地址:https://github.com/wdquan1985/dubbo-dynamicDatasource-jtaAtomikos

wdquan19851029的专栏 2509

【SimPy系列博客之官方example学习与解读】—— Example 1: Bank Renege

Hello,优快云的各位小伙伴们,拖更了几年后,又重新开始记录这段时间准备学习的东西啦!最近博主在学习 SimPy 的相关知识,发现国内关于 SimPy 的介绍还是相对较少,且缺乏系统性,因此博主打算用1~2周的时间,边学边记,打算从 SimPy 官方给出的几个例子出发分析 SimPy 的使用场景和用法,希望能和大家互勉!那废话不多说,我们直接开始吧!今天要学习的例程是 Bank Renege。

凝望,划过星空的博客 2009

Unity 之如何使用Pico4u锚点功能实现一个世界锁GameRoot

摘要 空间锚点技术是混合现实(MR)应用的核心,能永久记录虚拟物体的空间位置。文章介绍了在Unity中使用Pico SDK实现空间锚点的完整流程:1)环境配置需安装XR模块和Pico SDK;2)关键操作包括启动空间感知、创建/删除/查询/更新锚点;3)提供了经典应用案例,通过GameRoot节点实现场景固定和锚点同步。源码展示了基于XR交互工具包的锚点抓取与位置更新实现,为MR开发提供了实用参考方案。

TxNet 972

【SpringBoot框架篇】4.集成jta-atomikos实现分布式事务

springboot集成jta-atomikos实现分布式事务简介引入依赖修改配置文件添加配置读取类创建多数据源,管理事务数据持久化数据库DLL文件模拟事务回滚 简介 1.分布式事务 说到分布式事务,可以理解为,由于分布式而引起的事务不一致的问题。随着项目做大,模块拆分,数据库拆分。一次包含增删改操作数据库涉及到了更新两个不同物理节点的数据库,这样的数据库事务只能保证自己处理的部分的事务,但是整个...

皓亮君的博客 6127

手把手教你学simulink实例--基于Simulink的船舶发电柴油机建模与健康状态研究

船舶发电柴油机是现代船舶电力系统的核心设备,为船舶提供稳定的电能供应。然而,由于长期运行在复杂的海洋环境中,船舶发电柴油机容易受到磨损、腐蚀和疲劳等损伤的影响,导致其性能下降甚至发生故障。因此,对船舶发电柴油机进行建模和健康状态监测具有重要意义。本项目旨在使用MATLAB/Simulink平台,建立船舶发电柴油机的动力学模型,并通过仿真分析其健康状态,预测潜在故障,从而提高船舶运行的安全性和经济性。

MHD0815的博客 1325

Atomikos简介

开发原因 在Java后端开发过程中事务控制非常重要,而Spring为我们提供了方便的声明式事务方法@transactional。但是默认的Spring事务只支持单数据源,而实际上一个系统往往需要写多个数据源,这个时候我们就需要考虑如何通过Spring实现对分布式事务的支持。 开发思路 对于数据库层面的分布式事务而言,JTA(Java Transaction API,XA的JAVA实现方案)是...

猎户星座 1万+

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2778

第11.4节 混合储能系统能量管理

混合储能系统(HESS)的能量管理策略采用分层架构实现多时间尺度优化:调度层(小时级)进行经济优化,协调层(秒级)基于频率分解分配功率,执行层(毫秒级)实现快速跟踪。深度强化学习(DRL)方法通过定义状态空间、动作空间和多目标奖励函数,能有效处理系统不确定性和多目标优化问题。HESS性能评估需综合技术指标(如调节性能Kp值、设备寿命指标)和经济指标(净现值NPV、平准化储能成本LCOS),并遵循"建模-仿真-实验"的闭环流程。

技术工作者 246

分布式事务之 Atomikos

关于分布式事务的解决方案被提到最多的就是“TCC”、“基于消息”。但其实还有一种非常经典的解决方案:JTA。而 Atomikos 就是 XA、JTA 那一套的实现,属于 2PC。 之前在项目中使用 Atomikos 主要是用来解决单服务多数据源的场景,当然它也可以解决跨服务之间的分布式事务问题。本文主要是从源码的角度简要分析一下 Atomikos 的实现。 #Atomikos+Spring Boot+MyBatis+Druid 的使用 在网上找了一个 Atomikos+Spring Boot+MyBatis

【欢迎关注公众号:冬瓜白】 3320

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

springboot 分布式事务的解决方案(JTA+Atomic+多数据源)(^_^^_^)

首先,到底啥是分布式事务呢,比如我们在执行一个业务逻辑的时候有两步分别操作A数据源和B数据源,当我们在A数据源执行数据更改后,在B数据源执行时出现运行时异常,那么我们必须要让B数据源的操作回滚,并回滚对A数据源的操作;这种情况在支付业务时常常出现;比如买票业务在最后支付失败,那之前的操作必须全部回滚,如果之前的操作分布在多个数据源中,那么这就是典型的分布式事务回滚; 了解了什么是分布式事务,那分...

jaryle的专栏 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Atomikos 分布式事务的使用

由于项目上的需要,我要同时往orcale数据库与sqlserver数据中插入数据,需要在一个事务之内完成这两个库的提交。参考了一下网上的各种JTA(Java Transaction API)实现之后,选择了Atomikos的实现。 因为当时使用的时候绕的弯路大了点,所以写篇文章记录下基本的实现过程,方便日后查看。如果是第一次使用,强烈建议去Atomikos查看官方例子与指导,写的很详细。 前提...

chuixue24的博客 1246

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot+Mybatis+atomikos实现分布式事务

背景:随着业务的不断发展,数据量的倍增,单个数据库的性能产生瓶颈,我们可能会对数据库进行分区(也就是我们常说的分库分表),这里所说的分区指的是物理分区,分区之后可能不同的库就处于不同的服务器上了,这个时候单个数据库的ACID已经不能适应这种情况了,而在这种ACID的集群环境下,再想保证集群的ACID几乎是很难达到,或者即使能达到那么效率和性能会大幅下降,这个时候我们就会用到分布式事务 Atomikos 是干嘛用的? Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理.

酷爱编程的小猿同学 1448

spring boot + mybatis plus + 多数据源 + 分布式事务

本文介绍一种使用spring boot + mybatis plus + 多数据源 + 分布式事务 的实现方式。 由于涉及多个数据库,自然就涉及到分布式事务。先了解几个概念: 1、XA是什么? XA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。 ...

CodingSoldier的博客 6396
上一篇: java.sql.Time 字段类型匹配MySql的time表字段类型时差问题
下一篇: Spring-Cloud例子(demo)
mcatto
博客等级 码龄15年 87粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值