千家信息网

SpringBoot中如何使用Dynamic Datasource配置多数据源

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"SpringBoot中如何使用Dynamic Datasource配置多数据源"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些
千家信息网最后更新 2026年11月03日SpringBoot中如何使用Dynamic Datasource配置多数据源

本篇内容介绍了"SpringBoot中如何使用Dynamic Datasource配置多数据源"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

功能特性:

  1. 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。

  2. 支持无数据源启动,支持配置懒启动数据源(3.3.2+)。

  3. 支持数据库敏感配置信息 加密 ENC()。

  4. 支持每个数据库独立初始化表结构schema和数据库database。

  5. 支持 自定义注解 ,需继承DS(3.2.0+)。

  6. 提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。

  7. 简化Druid和HikariCp配置,提供 全局参数配置 。配置一次,全局通用。

  8. 提供 自定义数据源来源 方案。

  9. 提供项目启动后 动态增加移除数据源 方案。

  10. 提供Mybatis环境下的 纯读写分离 方案。

  11. 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。

  12. 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。

  13. 提供对shiro,sharding-jdbc,quartz等第三方库集成的方案,注意事项和示例。

  14. 提供 基于seata的分布式事务方案。 附:不支持原生spring事务。

  15. 提供 本地多数据源事务方案。 附:不支持原生spring事务(3.3.1+)。

我们这篇文章主要实现读写分离,一主多从的环境。

  • 主数据库建议只执行 INSERT、UPDATE、DELETE 操作。

  • 从数据库建议只执行 SELECT 操作。

一、准备数据库

主库:PiaoDB

从库1:PiaoDB2

从库2:PiaoDB3

二、导入POM文件

引入dynamic-datasource-spring-boot-starter。

    com.baomidou    dynamic-datasource-spring-boot-starter    3.3.2

三、编辑配置文件

我们配置了一个主库、两个从库。

  • 配置文件中所有以下划线 _ 分割的数据源"首部"即为组的名称,相同组名称的数据源会放在一个组下。

  • 默认的数据源名称为 master ,我们可以通过 spring.datasource.dynamic.primary 修改。

spring:  datasource:    dynamic:      primary: master #设置默认的数据源或者数据源组,默认值即为master      strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.      datasource:        master:          url: jdbc:mysql://localhost:3306/PiaoDB?serverTimezone=Asia/Shanghai          username: root          password: root          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置        slave_1:          url: jdbc:mysql://localhost:3306/PiaoDB2?serverTimezone=Asia/Shanghai          username: root          password: root          driver-class-name: com.mysql.jdbc.Driver        slave_2:          url: jdbc:mysql://localhost:3306/PiaoDB3?serverTimezone=Asia/Shanghai          username: root          password: root          driver-class-name: com.mysql.jdbc.Driver

因为我们使用的是阿里数据库连接池 Druid,需要排除原生 Druid 的快速配置类。

其他第三方集成地址:集成Druid

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)public class Application {  public static void main(String[] args) {    SpringApplication.run(Application.class, args);  }}

某些springBoot的版本上面可能无法排除可用以下方式排除。

spring:  autoconfigure:    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

除了配置一主多从,我们还可以配置。

# 多主多从                      纯粹多库(记得设置primary)                   混合配置spring:                               spring:                               spring:  datasource:                           datasource:                           datasource:    dynamic:                              dynamic:                              dynamic:      datasource:                           datasource:                           datasource:        master_1:                             mysql:                                master:        master_2:                             oracle:                               slave_1:        slave_1:                              sqlserver:                            slave_2:        slave_2:                              postgresql:                           oracle_1:        slave_3:                              h3:                                   oracle_2:

四、编写代码

使用 @DS 切换数据源。@DS 可以注解在方法上和类上。如果同时存在,方法注解优先于类上注解。强烈建议注解在 service 实现或 mapper 接口方法上。

  • @DS("xxx") 指定使用 xxx 这个数据源,xxx 可以为组名也可以为具体某个库的名称。如果是组名则切换时采用负载均衡算法切换。如果指定的组名或者库不存在,则自动使用默认数据源(主库)

  • 如果没有 @DS,则使用默认数据源(主库)

  • 如果设置了 @DS 但没有指定某个组或者库,则根据 DynamicDataSourceStrategy 策略,选择一个从库。默认负载均衡策略。

1、编写Controller

@RestController@RequiredArgsConstructor@RequestMapping("/demo")public class DemoController {    private final DemoService demoService;    @GetMapping("/add")    public String add() {        return demoService.add(null) + "";    }    @GetMapping("/selectGoodsInfo")    public List selectGoodsInfo(){        return demoService.selectGoodsInfo();    }    @GetMapping("/selectMasterGoodsInfo")    public List selectMasterGoodsInfo(){        return demoService.selectMasterGoodsInfo();    }}

2、编写Service

public interface DemoService {    boolean add(GoodsInfo param);    List selectGoodsInfo();    List selectMasterGoodsInfo();}
@Service@RequiredArgsConstructorpublic class DemoServiceImpl implements DemoService {    private final DemoMapper demoMapper;    @DS("master")    @Override    public boolean add(GoodsInfo param) {        param = new GoodsInfo();        param.setGname("1200元秒杀华为Pad");        param.setGnum(100);        return demoMapper.insertGoodsInfo(param);    }    @DS("slave")    @Override    public List selectGoodsInfo() {        return demoMapper.selectGoodsInfo();    }    @DS("master")    @Override    public List selectMasterGoodsInfo() {        return demoMapper.selectGoodsInfo();    }}

3、编写Mapper

@Mapperpublic interface DemoMapper {    boolean insertGoodsInfo(GoodsInfo param);    List selectGoodsInfo();}
                insert into t_goods_info (gname, gnum, gcreatetime)            values (#{gname}, #{gnum}, now());    

五、验证结果

1、请求新增接口(往主库添加数据):127.0.0.1:8086/demo/add

2、请求查询主库数据接口:127.0.0.1:8086/demo/selectMasterGoodsInfo

3、请求从库数据接口(负载均衡):

第一次请求:

第二次请求:

"SpringBoot中如何使用Dynamic Datasource配置多数据源"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 数据源 配置 支持 数据库 方案 注解 事务 名称 接口 切换 均衡 建议 文件 方法 全局 内容 动态 参数 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 互联网科技公司华为 科技和互联网公司 厦门中拓互联网络科技有限公司 互联网和科技创新 互联网科技金融公司 万易互联网科技 杭州互联网科技公司 润盈互联网科技 掌上梦互联网科技 成都互联网科技公司100强 广州恒生互联网科技有限 湖北码尼互联网科技有限公司电话 花神(南京)互联网科技有限公司 杭州壁岐互联网科技有限公司 互联网媒体平台算高科技产业 企晟互联网信息科技有限公司 长沙茂晟互联网科技有限公司 广州智享互联网科技 玉溪新华互联网科技怎么选 深圳市人人互联网科技有限公司 金融科技与互联网金融 互联网科技公司发展 汇久创客互联网科技 长亮科技互联网金融 互联网科技公司做什么 哈尔滨秒房互联网科技有限公司 洛阳昕诺飞互联网科技有限公司 乌苏新华互联网科技做什么的 互联网与数字科技关系
0