This commit is contained in:
2023-07-18 17:31:08 +08:00
parent 1b3a3fdfb7
commit 94242e17a0
13 changed files with 172 additions and 95 deletions

View File

@ -5,6 +5,7 @@ import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
import com.qiaoba.common.base.constant.TenantConstant;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.exception.ServiceException;
import com.qiaoba.common.database.entity.DynamicDataSource;
@ -36,9 +37,10 @@ public class DynamicDatasourceServiceImpl implements DynamicDatasourceService {
Map<String, List<DynamicDataSource>> datasourceMap = new LinkedHashMap<>();
List<SysTenant> sysTenants = sysTenantService.selectList(SysTenantParam.buildNormalSelectParam());
for (SysTenant sysTenant : sysTenants) {
List<SysTenantDatasource> datasourceList = sysTenantDatasourceService.selectList(new SysTenantDatasourceParam(sysTenant.getTenantId()));
datasourceMap.put(sysTenant.getTenantId(), transformList(datasourceList));
if (!TenantConstant.DEFAULT_TENANT_ID.equals(sysTenant.getTenantId())) {
List<SysTenantDatasource> datasourceList = sysTenantDatasourceService.selectList(new SysTenantDatasourceParam(sysTenant.getTenantId()));
datasourceMap.put(sysTenant.getTenantId(), transformList(datasourceList));
}
}
return datasourceMap;
}

View File

@ -3,6 +3,7 @@ package com.qiaoba.module.tenant.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
@ -17,6 +18,7 @@ import com.qiaoba.common.database.context.PrimaryDatasourceContext;
import com.qiaoba.common.database.entity.DynamicDataSource;
import com.qiaoba.common.database.util.DatasourceUtil;
import com.qiaoba.common.database.util.JdbcUtil;
import com.qiaoba.common.redis.service.RedisService;
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;
@ -38,6 +40,8 @@ import java.util.Objects;
public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceService {
private final SysTenantDatasourceMapper sysTenantDatasourceMapper;
private final BackupDatasourceContext backupDatasourceContext;
private final RedisService redisService;
@Override
public SysTenantDatasource selectPrimary(String tenantId) {
@ -71,7 +75,7 @@ public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceServic
int result = sysTenantDatasourceMapper.insert(sysTenantDatasource);
if (result > BaseConstant.HANDLE_ERROR) {
// 添加到备用数据源
BackupDatasourceContext.addBackupMap(sysTenantDatasource.getTenantId(), dynamicDataSource);
backupDatasourceContext.addBackupMap(dynamicDataSource);
}
return result;
}
@ -87,7 +91,7 @@ public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceServic
int result = sysTenantDatasourceMapper.updateById(sysTenantDatasource);
if (result > BaseConstant.HANDLE_ERROR) {
// 更新备用数据源
BackupDatasourceContext.updateBackupMap(sysTenantDatasource.getTenantId(), dynamicDataSource);
backupDatasourceContext.updateBackupMap(dynamicDataSource);
}
return result;
}
@ -138,12 +142,17 @@ public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceServic
Object oldDataSource = PrimaryDatasourceContext.get(tenantId);
// 更新新得数据源为租户主要数据源
DatasourceUtil.changePrimaryDatasource(tenantId, dataSource);
// 通知其他服务更换主数据源
dynamicDataSource.setServerSn(BaseConstant.SERVER_SN);
redisService.convertAndSend("test", JSONUtil.toJsonStr(dynamicDataSource));
// 从备用数据源中移除
backupDatasourceContext.deleteBackupMap(dynamicDataSource);
// 将老的租户数据源设置为备用
if (Objects.nonNull(oldDataSource)) {
DruidDataSource druidDataSource = ((DruidDataSource) oldDataSource);
String ip = DataBaseEnum.getIp(druidDataSource.getUrl(), druidDataSource.getDriverClassName());
SysTenantDatasource sysTenantDatasource = sysTenantDatasourceMapper.selectByIp(tenantId, ip);
BackupDatasourceContext.addBackupMap(tenantId, transform(sysTenantDatasource));
backupDatasourceContext.addBackupMap(transform(sysTenantDatasource));
druidDataSource.close();
}
} else {