POM
<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
dynamic-datasource
数据源管理-Controller
先提供增加数据源和接口切换指定数据源
//未引入其他项目包
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.sql.DataSource;
import java.util.List;
import java.util.Set;
@RestController
@RequestMapping("/system/datasource")
@Validated
@Slf4j
public class DataSourceController {
@Autowired
private DataSource dataSource;
@Autowired
private DefaultDataSourceCreator dataSourceCreator;
@Autowired
TenantService tenantService;
/**
* TODO
* - 数据源管理,无效数据源及时删除,持续添加数据源问题
* - 切换数据源时,验证事务,能否回滚
* - 性能问题
* - 其他数据源配置是否沿用master默认配置(initial-size,min-idle,max-active等配置)?未知
* @param dto
* @return
*/
@PostMapping("/add")
@ApiOperation("通用添加数据源(推荐)")
public Set<String> add(@Validated @RequestBody SysDatabase dto) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
// 这里主要是将dto的属性赋值给dataSourceProperty
//所以dataSourceProperty中必要的参数,dto都要提供
BeanUtils.copyProperties(dto, dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource2 = dataSourceCreator.createDataSource(dataSourceProperty);
// PoolName就是我们yaml配置中说的数据源名称
ds.addDataSource(dto.getPoolName(), dataSource2);
return ds.getDataSources().keySet();
}
@GetMapping("/switch")
public List<TenantDO> switchDataSource(@RequestParam(required = false) String poolName) {
List<TenantDO> tenantDOList = tenantService.listA2(poolName);
for (TenantDO tenantDO : tenantDOList) {
log.info(tenantDO.toString());
}
return tenantDOList;
}
}
Service-查询时切换数据源
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
@Override
public List<TenantDO> listA2(String poolName) {
if (null != poolName){
DynamicDataSourceContextHolder.clear();
//切换到对应poolName的数据源
DynamicDataSourceContextHolder.push(poolName);
}
final List<TenantDO> tenantDOList = tenantMapper.selectList();
return tenantDOList;
}
租户场景
通过增加拦截器,获取当前登录用户租户信息,切换对应数据源
问题
数据源管理,无效数据源及时删除,持续添加数据源问题
切换数据源时,验证事务,能否回滚
性能测试
多线程并发场景测试:线程安全?
其他数据源配置是否沿用master默认配置(initial-size,min-idle,max-active等配置)?未知
补充内容
项目启动加载已有数据源,新增租户创建对应库表和对应数据源
.
.
.
参考:基于dynamic-datasource实现多租户动态切换数据源_dynamicdatasource动态数据源-CSDN博客