温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-04-07 14:44:14 来源:亿速云 阅读:1640 作者:iii 栏目:编程语言

本篇内容介绍了“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

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配置多数据源”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI