想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果发现,网上的文章要么版本太老有些过时,要么用的不是mybatis-plus而是mybaits,要么步骤繁琐、需要自己手动编写aop切面代码,要么在同一service层方法中只能使用@Transactional实现单个数据源的事务管理控制,总是觉得有点不太完美,所以综合了以上文章的不足之处和可以借鉴之处,在这里总结出了一个万能的、可以适应多方面需求的多数据源配置方法,以满足相对完整的、代码简练的分布式事务控制需求。现在分享给大家。
一. 从maven中导入必须用到的依赖
<dependencies><!-- mysql数据库依赖组件--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><!-- mybatis-plus依赖组件--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><!-- druid连接池依赖组件--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><!-- 多数据源的分布式事务控制--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-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=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&autoReconnect=trueusername:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverslave:url:jdbc:mysql://localhost:3307/remote_test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&autoReconnect=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;