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. 通过这次对多数据源的原理的研究发现其实挺有意思的,并且于很早之前的没有框架的时候实现数据库连接串联了起来,这样这块知识会比较影响深刻。
相关推荐
千云6 小时前
ClaudeCode Skill生成教学培训文档,助力新人快速学习项目
人工智能·后端·ai编程
吃口巧乐兹7 小时前
理解 Agent 中的 Slash Command:从概念到自定义命令实践
java·github
fliter7 小时前
Rust 构建为什么这么慢?从工具链底层到实际优化的完整排查指南
后端
用户9772654613847 小时前
Boto3:Python 开发者操作 AWS 的官方 SDK
后端
程序员cxuan7 小时前
姚顺雨这次访谈,腾讯终于把 AI 下半场讲明白了
人工智能·后端·程序员
神奇小汤圆7 小时前
开源:把自己"博客转推文"蒸馏成一个 Agent Skill
后端
雪隐8 小时前
个人电脑玩AI-02让5060 Ti给你打工——Whisper语音识别篇(下)
人工智能·后端
倒流时光三十年8 小时前
第十八章 搜索历史保存功能实现记录
spring boot·微信小程序
夕除8 小时前
shizhan--10
java·开发语言
吴声子夜歌8 小时前
JVM——并发容器实现原理
java·jvm·并发容器