springboot mybatisPlus 动态加载多数据源 按线程分配数据源

Author Avatar
没饲养员的猩猩 10月 24,2022
  • 在其它设备中阅读本文章

springboot mybatisPlus 动态加载多数据源 按线程分配数据源

大体情况
  1. 根据配置文件的主数据源
  2. 查询表中配置的数据源连接信息
  3. 为不同线程分配数据源 执行业务
  4. 清除线程数据源
涉及关键类:
  • mybatis plus 的 DynamicRoutingDataSource
  • java.lang ThreadLocal
需要的mybatis plus 依赖(版本看情况)
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.4.1</version>
    </dependency>
类内注入 DataSource
    @Resource
    private DataSource dataSource;
根据数据源信息初始化到DataSource中
public boolean initNewDS(){
    // 构建DataSourceProperty 添加到DataSource内 dsCode唯一,重复覆盖
    boolean status = false;
    try{
        DataSourceProperty ds = new DataSourceProperty();
        ds.setDsCode(xxx);
        ds.setDriverClassName(xxx);
        ds.setUrl(xxx);
        ds.setUsername(xxx);
        ds.setPassword(xxx);
        DynamicRoutingDataSource source = (DynamicRoutingDataSource) dataSource;
        source.removeDataSource(xxx);
        DataSource newDS = defaultDataSourceCreator.createDataSource(ds);
        source.addDataSource(xxx,newDS);
        status = true;
    }catch(Exception e){
        log.error("Error creating data source poolCode: " + dbInfo.getPoolCode() + "异常信息:", e);
    }
    log.info("creating ds success dsKey:" + dbInfo.getPoolCode());
    return status;
}

###### 各业务执行线程处理指定数据源业务

//为线程切换对应数据源
DynamicDataSourceContextHolder.push(key);
            log.info("当前同步线程使用数据源:" + DynamicDataSourceContextHolder.peek());

##### 使用完清理掉(清理掉会变为默认数据源)
DynamicDataSourceContextHolder.clear();