springboot mybatisPlus 动态加载多数据源 按线程分配数据源
springboot mybatisPlus 动态加载多数据源 按线程分配数据源
大体情况
- 根据配置文件的主数据源
- 查询表中配置的数据源连接信息
- 为不同线程分配数据源 执行业务
- 清除线程数据源
涉及关键类:
- 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();