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. 通过这次对多数据源的原理的研究发现其实挺有意思的,并且于很早之前的没有框架的时候实现数据库连接串联了起来,这样这块知识会比较影响深刻。
相关推荐
IT_陈寒2 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码4 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo4 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志4 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
shushangyun_4 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..4 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects5 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰5 小时前
一些基础和问题解决
后端
陈随易5 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN5 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp