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

Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理
想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果发现,网上的文章要么版本太老有些过时,要么用的不是mybatis-plus而是mybaits,要么步骤繁琐、需要自己手动编写aop切面代码,要么在同一service层方法中只能使用@Transactional实现单个数据源的事务管理控制,总是觉得有点不太完美,所以综合了以上文章的不足之处和可以借鉴之处,在这里总结出了一个万能的、可以适应多方面需求的多数据源配置方法,以满足相对完整的、代码简练的分布式事务控制需求。现在分享给大家。一. 从maven中导入必须用到的依赖dependencies!-- mysql数据库依赖组件--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.20/version/dependency!-- mybatis-plus依赖组件--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.3.1/version/dependency!-- druid连接池依赖组件--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.22/version/dependency!-- 多数据源的分布式事务控制--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jta-atomikos/artifactId/dependency/dependencies以上除了一些必须的、通用的依赖之外,还引入了atomikos依赖包,这是实现分布式事务管理的关键。二. application.yml文件的配置这个配置是可以很灵活的,数据源配置都是自定义字段,到时候方便能够在java代码中引用,以下是两个数据源的示范:server:port:10010spring:autoconfigure:#停用druid连接池的自动配置exclude:com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:#选用druid的XADataSource数据源,因为这个数据源支持分布式事务管理type:com.alibaba.druid.pool.xa.DruidXADataSource#以下是自定义字段dynamic:primary:masterdatasource:master:url:jdbc:mysql://localhost:3306/local_test?useUnicode=truecharacterEncoding=utf-8allowMultiQueries=trueuseSSL=falsezeroDateTimeBehavior=convertToNullserverTimezone=Asia/ShanghaiautoReconnect=trueusername:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverslave:url:jdbc:mysql://localhost:3307/remote_test?useUnicode=truecharacterEncoding=utf-8allowMultiQueries=trueuseSSL=falsezeroDateTimeBehavior=convertToNullserverTimezone=Asia/ShanghaiautoReconnect=trueusername:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Drivervalidation-query:SELECT 1因为我们把数据源相关的自动配置给关闭了,所以druid的自动配置项写在这里已经是无效的了,包括druid的监控功能在这里配置是不好使的。三. Dao层配置因为我们现在要使用的是多个数据源,所以在这些地方和单数据源配置相比,略微不同。dao层结构如以下图:因为这里模拟的两个数据源中这张表的结构都是相同的,所以实体类就共用同一个了。注意两个数据源表的实体类是可以放在同一个文件夹中的,但是每个数据源的mapper接口类和mapper.xml文件务必放在不同的文件夹中,比如本项目分别用了master和slave两个文件夹分别存放不同数据源的mapper接口和xml文件,这是实现数据源切换的关键。贴出代码:1.User@Data@AllArgsConstructor@NoArgsConstructor@TableName("user_test")publicclassUser{@TableId(type=IdType.AUTO)privateIntegerid;privateStringmobile;privateStringpassword;