动态数据源就该用它~

1、dynamic-datasource介绍

在当今这个数据驱动的时代,企业级应用面临着越来越多的挑战。其中,多数据源管理成为了一个关键问题。为了解决这一问题,Dynamic-Datasource应运而生。本文将为您详细介绍Dynamic-Datasource这一多数据源解决方案,带您领略其带来的便捷与高效。

2、dynamic-datasource使用

以下以springboot3为例

(1)引入依赖

  <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
  </dependency>

(2)添加多数据源配置

server:
  port: 9393
spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    dynamic:
      druid:
        initial-size: 10  # 初始化连接池大小
        min-idle: 20  # 连接池最小空闲连接数
        maxActive: 500  # 连接池最大活跃连接数
        maxWait: 60000  # 获取连接的最大等待时间(毫秒)
        timeBetweenEvictionRunsMillis: 60000  # 检测连接是否空闲的时间间隔(毫秒)
        minEvictableIdleTimeMillis: 300000  # 连接在池中最小空闲时间(毫秒)
        query-timeout: 3600  # 查询超时时间(秒)
      primary: master  # 主数据源名称,这里设置为 master
      strict: false  # 是否严格检查数据源,false 表示不严格检查
      grace-destroy: true  # 是否优雅销毁连接池,true 表示优雅销毁,等待 10 秒后再销毁
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/t1
          username: root
          password: ***
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave1:
          url: jdbc:mysql://127.0.0.1:3306/t2
          username: root
          password: ***
          driver-class-name: com.mysql.cj.jdbc.Driver
#        slave2:
#          url: jdbc:mysql://127.0.0.1:3306/t3
#          username: root
#          password: ***
#          driver-class-name: com.mysql.cj.jdbc.Driver
      aop:
        enabled: true # 可能表示延迟加载数据源,即在实际需要时才创建和初始化数据源。
      lazy: true

(3)使用
A: 注解方式
@DB
该注解可以用于方法上,标注方法走对应的数据源
eg:
在这里插入图片描述
B:手动模式
直接在操作数据之前指定数据库

DynamicDataSourceContextHolder.push("slave2");

(4) 实现传入url创建数据源
A:将bean注入到spring统一管理

@Configuration
public class DataSourceConfig {

    @Autowired
    private DynamicDataSourceProperties properties;

    @Bean
    public DynamicRoutingDataSource dataSource() {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(List.of());
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        for (String key : properties.getDatasource().keySet()) {
            DataSourceProperty dataSourceProperty = properties.getDatasource().get(key);
            DriverManagerDataSource ds = new DriverManagerDataSource();
            ds.setUrl(dataSourceProperty.getUrl());
            ds.setUsername(dataSourceProperty.getUsername());
            ds.setPassword(dataSourceProperty.getPassword());
            ds.setDriverClassName(dataSourceProperty.getDriverClassName());
            dataSource.addDataSource(key,ds);
        }
        return dataSource;
    }
}

B:动态将数据库链接配置传入创建数据源加入到路由集合

    @Override
    public boolean createDdBase(Source source) {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/t3");
        ds.setUsername(source.getUserName());
        ds.setPassword(source.getPassWord());
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.addDataSource("slave2",ds);
        return true;
    }

(5)测试
场景一:
请求携带数据源名称,在过滤器拦截切换对应数据源
在这里插入图片描述

在这里插入图片描述
场景二:
先携带数据源连接请求创建数据源,然后再请求新的数据源
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值