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. 通过这次对多数据源的原理的研究发现其实挺有意思的,并且于很早之前的没有框架的时候实现数据库连接串联了起来,这样这块知识会比较影响深刻。
相关推荐
兔子零10243 分钟前
GPT-5.5 与 DeepSeek-V4:大模型竞争的本质,正在从“谁更强”变成“谁让成本更低”
前端·javascript·后端
A-Jie-Y1 小时前
JAVA23种设计模式
java·设计模式
小同志001 小时前
IoC 详解
java·开发语言
BENA ceic1 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
asdfg12589631 小时前
以生活例子理解编程中的“多态”
java·生活·多态
wsjsf1 小时前
智能代码审查助手的搭建
java·学习·ai编程
xuhaoyu_cpp_java1 小时前
MyBatis学习(二)
java·经验分享·笔记·学习·mybatis
石榴树下的七彩鱼2 小时前
智能抠图 API 多语言接入实战:从零到上线的 Python / Java / PHP / JS 完整教程(附避坑指南)
java·python·php·智能抠图·api接入·石榴智能·shiliuai