add
This commit is contained in:
@ -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) {
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user