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. 通过这次对多数据源的原理的研究发现其实挺有意思的,并且于很早之前的没有框架的时候实现数据库连接串联了起来,这样这块知识会比较影响深刻。
相关推荐
救救孩子把13 分钟前
深入理解 Java 对象的内存布局
java
落落落sss15 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节21 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭28 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由34 分钟前
速成java记录(上)
java·速成
一直学习永不止步40 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明40 分钟前
面试知识储备-多线程
java·面试·职场和发展
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
煸橙干儿~~1 小时前
分析JS Crash(进程崩溃)
java·前端·javascript