千家信息网

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

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇内容介绍了"SpringBoot中如何使用Dynamic Datasource配置多数据源"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些
千家信息网最后更新 2024年09月22日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安全错误 数据库的锁怎样保障安全 提供网络服务器维护的公司 通信网络安全都有哪些 十八般武艺下载软件开发 全网全通网络技术有限公司 罗湖区无源网络技术开发服务标准 二道区新时代网络安全诚信经营 光网络技术知识点总结 OFd 软件开发公司 可进行软件开发办公笔记本 南京专业软件开发公司 广西鸿雪互联网科技有限公司 长春市网络安全 廊坊跑腿app软件开发多少钱 java手机编程软件可以连接数据库 降低企业所面临的网络安全手段 ktv怎么添加服务器 安徽服务器维修调试费用 如果服务器崩溃会怎样 网络安全竞赛吧 公安局网络安全自查评估报告 关于网络安全的合理化建议 英国网络安全前景 安信网络安全插画 含3个触发器的数据库设计 什么是网络安全 包括哪 南京银行业网络安全竞赛 服务器安全的防护策略 饿了么服务器费用 保证网络安全的措施主要包括 服务器400请求签名无效
0