动态数据源
项目使用多数据源,dynamic-datasource-spring-boot-starter实现动态切换数据源。
准备
maven
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
application.yaml
spring:
datasource:
dynamic:
primary: hub_exampledb
strict: false
datasource:
hub_exampledb:
url: jdbc:mysql://127.0.0.1:3306/hub_exampledb
username: hub_example
password: h12345678
driver-class-name: com.mysql.cj.jdbc.Driver
hub_example02db:
url: jdbc:mysql://127.0.0.1:3306/hub_example02db
username: hub_example02
password: h12345678
driver-class-name: com.mysql.cj.jdbc.Driver
使用
动态加载数据源
1 数据源服务
public class DataSourceService{
private final DataSourceCreator dataSourceCreator
/**
* 更新(新增)动态数据的数据源列表
*
* @param entity 数据源
*/
private void addDynamicDataSource(DataSource entity) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
dataSourceProperty.setPoolName(entity.getDsName());
dataSourceProperty.setUrl(entity.getDsUrl());
dataSourceProperty.setUsername(entity.getDsUserName());
dataSourceProperty.setPassword(entity.getDsPassword());
DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
if(!checkDataSource(dataSource)){
throw new RuntimeException("检查数据源是否配置正确");
}
DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class);
dynamicRoutingDataSource.addDataSource(dataSourceProperty.getPoolName(), dataSource);
}
/**
* 校验数据源配置是否有效
*
* @param entity 数据源信息
* @return Boolean 有效/无效
*/
private Boolean checkDataSource(DataSource entity) {
try {
DriverManager.getConnection(entity.getUrl(), entity.getDsUserName(), entity.getDsPassword());
} catch (SQLException e) {
log.error("数据源配置 {} , 获取链接失败", entity.getDsName(), e);
return Boolean.FALSE;
}
return Boolean.TRUE;
}
/**
* 删除动态数据的数据源
*
* @param entity 数据源
*/
private void removeDynamicDataSource(DataSource entity) {
DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class);
dynamicRoutingDataSource.removeDataSource(mdmSysDataSource.getDsName());
}
}
注解方式切换数据源
@DS(“dataSourceName”)注解作用于类,方法上, 实现数据源切换
//作用类
@DS("hub_example02db")
@Service
public class ProvinceServiceImpl implements ProvinceService {
@Autowired
private ProvinceMapper provinceMapper;
@Override
public ProvinceDTO queryProvinceByProvinceId(String provinceId) {
return provinceMapper.queryProvinceByProvinceId(provinceId);
}
}
//或者作用方法上
@Service
public class ProvinceServiceImpl implements ProvinceService {
@Autowired
private ProvinceMapper provinceMapper;
@DS("hub_exampledb")
@Override
public ProvinceDTO queryProvinceByProvinceId(String provinceId) {
return provinceMapper.queryProvinceByProvinceId(provinceId);
}
}
编码方式切换数据源
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
// 切换数据源
DynamicDataSourceContextHolder.push("dsName");
// todo some thing
DynamicDataSourceContextHolder.clear();