first commit

This commit is contained in:
2023-06-13 23:12:09 +08:00
parent c407eace59
commit 5511fd8fb0
6 changed files with 203 additions and 186 deletions

View File

@ -0,0 +1,23 @@
package com.qiaoba.module.tenant.runner;
import com.qiaoba.common.base.constants.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class SysTenantRunner implements ApplicationRunner {
private final SysTenantService sysTenantService;
@Override
public void run(ApplicationArguments args) throws Exception {
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
sysTenantService.resetCache();
BaseContext.clearTenantId();
}
}

View File

@ -44,6 +44,9 @@ public class DynamicDatasourceServiceImpl implements DynamicDatasourceService {
List<DynamicDataSource> dynamicDataSourceList = new ArrayList<>();
for (SysTenantDatasource datasource : datasourceList) {
DynamicDataSource dynamicDataSource = BeanUtil.copyProperties(datasource, DynamicDataSource.class);
dynamicDataSource.setInitialSize(datasource.getInitCount());
dynamicDataSource.setMinIdle(datasource.getMinCount());
dynamicDataSource.setMaxActive(datasource.getMaxCount());
dynamicDataSource.setDriver(DataBaseEnum.getDriver(datasource.getType()));
dynamicDataSource.setUrl(DataBaseEnum.getUrl(datasource.getType(), datasource.getIp(), datasource.getPort(), datasource.getName()));
dynamicDataSourceList.add(dynamicDataSource);

View File

@ -1,6 +1,7 @@
package com.qiaoba.module.tenant.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiaoba.auth.utils.SecurityUtil;
import com.qiaoba.common.base.constants.BaseConstant;
@ -22,10 +23,10 @@ import com.qiaoba.module.tenant.mapper.SysTenantMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.util.Date;
import java.util.List;
@ -38,32 +39,18 @@ import java.util.Objects;
* @version 1.0
* @since 2023/5/30 10:55
*/
@Service
@Configuration
@RequiredArgsConstructor
@Slf4j
public class SysTenantServiceImpl implements SysTenantService {
@Value("${qiaoba.datasource.master.driver}")
private String driver;
@Value("${qiaoba.datasource.master.url}")
private String url;
@Value("${qiaoba.datasource.master.username}")
private String username;
@Value("${qiaoba.datasource.master.password}")
private String password;
@Value("${spring.application.name}")
private String baseDatabase;
private final SysTenantMapper sysTenantMapper;
private final SysTenantDatasourceService sysTenantDatasourceService;
private final DynamicDataSourceConfig dynamicDataSourceConfig;
private final RedisService redisService;
@PostConstruct
public void init() {
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
resetCache();
BaseContext.clearTenantId();
}
@Value("${spring.application.name}")
private String baseDatabase;
@Override
public int insert(SysTenant sysTenant) {
@ -177,29 +164,32 @@ public class SysTenantServiceImpl implements SysTenantService {
* 处理字段模式
*/
private Connection column() {
return JdbcUtil.getConnection(driver, url, username, password);
DruidDataSource dataSource = DynamicDataSourceConfig.getPrimaryDataSource(TenantConstant.DEFAULT_TENANT_ID);
return JdbcUtil.getConnection(dataSource.getDriverClassName(), dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
}
/**
* 处理数据库模式
*/
private Connection schema(String tenantId) {
String realUrl = this.url.replaceFirst(baseDatabase, baseDatabase + BaseConstant.HYPHEN_JOIN_STR + tenantId);
return JdbcUtil.getConnection(driver, realUrl, username, password);
DruidDataSource dataSource = DynamicDataSourceConfig.getPrimaryDataSource(TenantConstant.DEFAULT_TENANT_ID);
String realUrl = dataSource.getUrl().replaceFirst(baseDatabase, baseDatabase + BaseConstant.HYPHEN_JOIN_STR + tenantId);
return JdbcUtil.getConnection(dataSource.getDriverClassName(), realUrl, dataSource.getUsername(), dataSource.getPassword());
}
/**
* 处理数据源模式
*/
private Connection datasource(String tenantId) {
SysTenantDatasource master = sysTenantDatasourceService.selectPrimary(tenantId);
if (Objects.isNull(master)) {
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId);
if (Objects.isNull(primary)) {
throw new ServiceException("未找到租户主数据源信息");
}
return JdbcUtil.getConnection(DataBaseEnum.getDriver(master.getType()), DataBaseEnum.getUrl(master.getType(), master.getIp(), master.getPort(), master.getName()), master.getUsername(), master.getPassword());
return JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()), DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getName()), primary.getUsername(), primary.getPassword());
}
private void toCache(SysTenant sysTenant) {
log.debug("加载租户信息进缓存, 租户ID: {}", sysTenant.getTenantId());
redisService.set(TenantConstant.TENANT_INFO_KEY_PREFIX + sysTenant.getTenantId(), sysTenant);
}
}

View File

@ -4,6 +4,6 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper">
<select id="selectTenantIds" resultType="string">
SELECT `tenant_id` FROM `sys_tenant_datasource` GROUP BY `tenant_id`
SELECT tenant_id FROM sys_tenant_datasource GROUP BY tenant_id
</select>
</mapper>