springboot结合baomidou dynamic-datasource组件实现多数据源

dynamic-datasource组件实现多数据源

一、背景介绍

博主最近研发的项目中由于业务需要,在项目中使用到多个数据源。使用到了baomidou的dynamic-datasource组件来实现访问不同的数据源。觉得挺有意思的也是进行了入门级别的研究,梳理出了dynamic-datasource组件宏观实现逻辑。

二、 思路方案

在没有框架之前我们访问数据库是创建数据库连接然后执行操作数据库的命令。那么如果要用到多个数据源的话就需要创建数据库A连接和数据库B连接,再分别用数据库A的连接和数据库B的连接访问数据库就行了。

其实baomidou 的dynamic-datasource组件实现多数据源也是差不多同一个道理。

三、过程

baomidou dynamic-datasource官方文档

  1. 引入dynamic-datasource-spring-boot-starter。
xml 复制代码
<!--动态数据库切换-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>4.1.3</version>
        </dependency>
  1. 配置数据源。
xml 复制代码
spring:
  datasource:
    dynamic: #动态
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://xxxxx:3306/xxx?useUnicode=true&characterEncoding=utf8
          username: xxxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf8
          username: xxx
          password: xxx
          driver-class-name: com.mysql.jdbc.Driver
  1. 使用 @DS 切换数据源。
java 复制代码
package com.wangwei.easycodemybatisplus.dao;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.Actor;

/**
 * (Actor)表数据库访问层
 *
 * @author wangwei
 * @since 2024-05-21 10:34:39
 */
@DS("slave_1")
public interface ActorDao extends BaseMapper<Actor> {

}
java 复制代码
package com.wangwei.easycodemybatisplus.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.ArproUserCourseInfo;

/**
 * 用户课程列表(ArproUserCourseInfo)表数据库访问层
 *
 * @author wangwei
 * @since 2024-05-21 09:39:06
 */
public interface ArproUserCourseInfoDao extends BaseMapper<ArproUserCourseInfo> {

}

当我们使用对应的Dao层接口的时候,会进行数据源的切换。

  1. 原理解析
    5.

dynamic-datasource组件中有DynamicRoutingDataSource 类继承自 Spring 的 AbstractRoutingDataSource,里面封装了dataSourceMap属性------dataSourceMap(concurrentHashMap)用户存储所有的数据库映射关系,键为数据源名称,值为DataSource对象(里面包含了数据库的url,账号,密码等信息)。并且也封装了操作数据源的方法。

@DS 注解:在 DAO 层或服务层的方法或类上使用 @DS 注解来指定使用哪个数据源,当一个数据源被指定使用(通过 @DS 注解),并且有数据库操作请求时,DynamicRoutingDataSource 会从dataSourceMap 中获取对应的 DataSource 对象,并创建数据库连接。

四、总结

  1. baomidou实现多数据源的切换在使用过程中还需要注意事务的问题。
  2. 明白了多数据源的底层之后,也可以自己实现多数据源切换。另外多数据源方案还有Sharding-JDBC 和Spring Data JPA多数据源方案。

五、升华

  1. 通过这次对多数据源的原理的研究发现其实挺有意思的,并且于很早之前的没有框架的时候实现数据库连接串联了起来,这样这块知识会比较影响深刻。
相关推荐
tntxia10 小时前
Geo Scene域名修改引起的一些问题
后端
用户2986985301410 小时前
Java 实现 Word 文档加密与权限解除
java·后端
vanuan11 小时前
给你的A2A-Agent加把锁-认证鉴权实战指南
后端
Yeats_Liao11 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿11 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
武子康11 小时前
调查研究-201 Rust 里的 dev build 和 release build:为什么同一份代码性能差这么多?
后端·架构·rust
鹤望兰67511 小时前
字节跳动国际支付-后端开发-三面面经
java
石小石Orz11 小时前
AI具身交互:实现一个会说话的3D虚拟伴侣
前端·人工智能·后端
Ai拆代码的曹操11 小时前
容器 CPU Throttling 有多坑?K8s CFS 限制让 P99 慢了 16 倍
后端