租户数据分库隔离创建租户动态增加数据源样例

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博客

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值