项目需求
项目ORM使用Mybatis-plus,数据源使用Dynamic-datasource。Dynamic-Datasource默认是基于yml配置文件的,但是需求中有许多外部数据源要随时增减,yml配置方式无法满足项目需求,经过翻看源码发现一些扩展点。
com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider
基于这个类扩展可以实现从数据库扩展表中读取配置,生成数据源
2.通过对com.baomidou.dynamic.datasource.DynamicRoutingDataSource
进行封装可以随时增减数据源。
封装代码如下:
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import javax.sql.DataSource;
public class DynamicDataSourceManager {
private final DynamicRoutingDataSource dataSource;
private final DefaultDataSourceCreator creator;
public DynamicDataSourceManager(DynamicRoutingDataSource dataSource, DefaultDataSourceCreator creator){
this.dataSource = dataSource;
this.creator = creator;
}
public void addDataSource(DataSourceProperty dataSourceProperty){
DataSource dataSource = this.creator.createDataSource(dataSourceProperty);
this.dataSource.addDataSource(dataSourceProperty.getPoolName(),dataSource);
}
public void addDataSource(String poolName,String driverClassName,String url,String username,String password){
DataSourceProperty dataSourceProperty = new DataSourceProperty();
dataSourceProperty.setPoolName(poolName);
dataSourceProperty.setDriverClassName(driverClassName);
dataSourceProperty.setUrl(url);
dataSourceProperty.setUsername(username);
dataSourceProperty.setPassword(password);
addDataSource(dataSourceProperty);
}
public void removeDataSource(String poolName){
this.dataSource.removeDataSource(poolName);
}
public DataSource getDataSource(String poolName){
return this.dataSource.getDataSource(poolName);
}
}
需要时在配置文件里注入
@Bean
public DynamicDataSourceManager dynamicDataSourceManager(DynamicRoutingDataSource dynamicRoutingDataSource, DefaultDataSourceCreator defaultDataSourceCreator) {
return new DynamicDataSourceManager(dynamicRoutingDataSource,defaultDataSourceCreator);
}
调用时
@Resource
private DynamicDataSourceManager dynamicDataSourceManager;
以上基本满足了项目需求