搜索
首页Javajava教程SpringBoot中如何使用Dynamic Datasource配置多数据源

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

May 16, 2023 pm 07:07 PM
springbootdynamicdatasource

功能特性:

  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。

<!-- 多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

三、编辑配置文件

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

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

  • 默认的数据源名称为 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<GoodsInfo> selectGoodsInfo(){
        return demoService.selectGoodsInfo();
    }

    @GetMapping("/selectMasterGoodsInfo")
    public List<GoodsInfo> selectMasterGoodsInfo(){
        return demoService.selectMasterGoodsInfo();
    }

}

2、编写Service

public interface DemoService {

    boolean add(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

    List<GoodsInfo> 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<GoodsInfo> selectGoodsInfo() {
        return demoMapper.selectGoodsInfo();
    }

    @DS("master")
    @Override
    public List<GoodsInfo> selectMasterGoodsInfo() {
        return demoMapper.selectGoodsInfo();
    }

}

3、编写Mapper

@Mapper
public interface DemoMapper {

    boolean insertGoodsInfo(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.DemoMapper">

    <select id="selectGoodsInfo" resultType="com.example.demo.entity.GoodsInfo">
        select * from t_goods_info
    </select>

    <insert id="insertGoodsInfo">
        insert into t_goods_info (gname, gnum, gcreatetime)
            values (#{gname}, #{gnum}, now());
    </insert>

</mapper>

五、验证结果

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配置多数据源

以上是SpringBoot中如何使用Dynamic Datasource配置多数据源的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。