This commit is contained in:
2023-06-08 17:56:44 +08:00
parent bc6d760c4f
commit ccf453b198
38 changed files with 524 additions and 101 deletions

View File

@ -58,6 +58,16 @@ public class DynamicDataSourceConfig {
dataSource.freshDataSource(DATA_SOURCE_MAP);
}
public void addTenantDataSource(String tenantId, String driver, String url, String username, String password, PoolInfo poolInfo) {
addDataSourceToMap(DynamicDatasourceConstant.MASTER_PREFIX + tenantId, buildDataSource(driver, url, username, password, poolInfo));
dataSource.freshDataSource(DATA_SOURCE_MAP);
}
public void deleteTenantDataSource(String tenantId) {
DATA_SOURCE_MAP.remove(DynamicDatasourceConstant.MASTER_PREFIX + tenantId);
dataSource.freshDataSource(DATA_SOURCE_MAP);
}
private static Object buildDataSource(String driver, String url, String username, String password, PoolInfo poolInfo) {
boolean flag = JdbcUtil.checkConnect(driver, url, username, password);
if (!flag) {

View File

@ -1,9 +1,9 @@
package com.qiaoba.common.database.filters;
import com.qiaoba.common.base.constants.BaseConstant;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.DatasourceService;
import com.qiaoba.common.base.constants.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.database.config.DynamicDataSourceContext;
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
import com.qiaoba.common.web.utils.ResponseUtil;
import org.springframework.core.annotation.Order;
@ -13,7 +13,6 @@ import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@ -30,26 +29,33 @@ import java.io.IOException;
public class DynamicDataSourceFilter extends OncePerRequestFilter {
@Resource
private DynamicDataSourceContext dynamicDataSourceContext;
private DatasourceService datasourceService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
before(request);
String tenantId = request.getHeader(TenantConstant.HEADER_KEY_TENANT);
// 主库或没有tenantId
if (StrUtil.isBlank(tenantId)
|| TenantConstant.DEFAULT_TENANT_ID.equals(tenantId)
|| request.getRequestURI().startsWith("/tenant")) {
setDefaultSetting();
filterChain.doFilter(request, response);
return;
}
if (!checkTenantInfo(tenantId)) {
// 检查租户的信息,是否存在,是否过期,是否禁用
ResponseUtil.response(response, "租户可能到期或被禁用");
return;
}
before(tenantId);
filterChain.doFilter(request, response);
after();
}
private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException {
// 检查租户的信息,是否存在,是否过期,是否禁用
ResponseUtil.response((HttpServletResponse) servletResponse, "租户: " + tenantCode + "已到期");
return false;
}
private void before(HttpServletRequest request) {
String tenantId = request.getHeader(TenantConstant.HEADER_KEY_TENANT);
// todo
private void before(String tenantId) {
//设置当前租户对应的数据源
BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY);
BaseContext.setDataSource(DynamicDatasourceConstant.MASTER_PREFIX + tenantId);
//设置当前租户对应的租户ID
BaseContext.setTenantId(tenantId);
//设置当前租户对应的数据库类型
@ -59,4 +65,16 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
private void after() {
BaseContext.clearAllHolder();
}
private boolean checkTenantInfo(String tenantId) {
return datasourceService.checkTenantInfo(tenantId);
}
private void setDefaultSetting() {
BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY);
//设置当前租户对应的租户ID
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
//设置当前租户对应的数据库类型
BaseContext.setDatabaseType("MySQL");
}
}

View File

@ -1,6 +1,8 @@
package com.qiaoba.common.database.properties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 数据源连接池信息
@ -10,6 +12,8 @@ import lombok.Data;
* @since 2023-04-23 15:37:43
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PoolInfo {
/**

View File

@ -2,7 +2,6 @@ package com.qiaoba.common.database.utils;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.web.advice.ExceptionAdvice;
import java.sql.Connection;
import java.sql.DriverManager;