当前位置:

首页 > 编程开发 > SpringBoot中如何使用Dynamic Datasource配置多数据源

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

功能特性:支持数据源分组,适用于多种场景纯粹多库读写分离一主多从混合模式。支持无数据源启动,支持配置懒启动数据源(3.3.2+)。支持数据库敏感配置信息加密ENC()。支持每个数据库独立初始化表结构schema和数据库database。支持自定义注解,需继承DS(3.2.0+)。提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。简化Druid和HikariCp配置,提供全局参数配置。配置一次,全局通用。提供自定义数据源来源方案。提供项目启动后动态增加移除数据源方案。提供Mybati

本文目录

    功能特性:

    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

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

    从库1:PiaoDB2

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

    从库2:PiaoDB3

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

    二、导入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
    @RequiredArgsConstructor
    public 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

    @Mapper
    public interface DemoMapper {
    
        boolean insertGoodsInfo(GoodsInfo param);
    
        List selectGoodsInfo();
    
    }
    
    
    
    
        
            select * from t_goods_info
        
    
        
            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

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

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

    第一次请求:

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

    第二次请求:

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    C# dynamic关键字作用:绕过编译类型检查
    C# dynamic关键字作用:绕过编译类型检查

    dynamic关键字将成员访问、方法调用和运算符操作的类型绑定延迟至运行时,跳过编译器静态检查,适用于COM互操作、ExpandoObject、JSON数据解析等场景,简化反射调用并绕过泛型边界限制,但牺牲性能与编译期安全。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    SpringBoot和SpringMVC有何区别?
    SpringBoot和SpringMVC有何区别?

    SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

    比较SpringBoot和SpringMVC的异同
    比较SpringBoot和SpringMVC的异同

    SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

    SpringBoot与SpringMVC的不同点是什么?
    SpringBoot与SpringMVC的不同点是什么?

    SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

    比较和选择指南:SpringCloud与SpringBoot的功能比较
    比较和选择指南:SpringCloud与SpringBoot的功能比较

    SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

    SpringCloud与SpringBoot:分析它们之间的相似与不同
    SpringCloud与SpringBoot:分析它们之间的相似与不同

    深入剖析SpringCloud和SpringBoot的异同引言:在构建企业级应用程序时,Spring框架已经成为开发者们的首选。它提供了一种简单而强大的方式来构建独立于平台的应用程序。Spring框架由两个核心模块组成:SpringBoot和SpringCloud。虽然它们都可以帮助开发者快速搭建应用程序,但它们的目标和用途存在一些差异。本文将深入剖析Spr

    从架构角度看SpringCloud与SpringBoot的差异
    从架构角度看SpringCloud与SpringBoot的差异

    从架构角度看SpringCloud与SpringBoot的差异引言:在当今的互联网时代,构建分布式系统已经成为了一种必要的需求。而SpringBoot和SpringCloud正是为了满足这个需求而诞生的。尽管它们都是由Spring框架所提供的解决方案,但从架构角度来看,它们存在着一些重要的差异。本文将从架构的角度出发,对SpringBoot和SpringCl

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。