Ver código fonte

多数据源

24282 2 anos atrás
pai
commit
73c2d278c0

+ 0 - 23
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java

@@ -1,23 +0,0 @@
-package com.ruoyi.common.annotation;
-
-import com.ruoyi.common.enums.DataSourceType;
-
-import java.lang.annotation.*;
-
-/**
- * 自定义多数据源切换注解
- * <p>
- * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
- *
- * @author ruoyi
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface DataSource {
-    /**
-     * 切换数据源名称
-     */
-    public DataSourceType value() default DataSourceType.MASTER;
-}

+ 18 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/DatasourceConstant.java

@@ -0,0 +1,18 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 数据源常量
+ */
+public interface DatasourceConstant {
+
+    /**
+     * 主数据源
+     */
+    String MASTER_NAME = "master";
+
+    /**
+     * 流程数据源
+     */
+    String SLAVE_NAME = "slave";
+
+}

+ 0 - 64
ruoyi-framework/src/main/java/com/ruoyi/framework/aspect/DataSourceAspect.java

@@ -1,64 +0,0 @@
-package com.ruoyi.framework.aspect;
-
-import com.ruoyi.common.annotation.DataSource;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.annotation.AnnotationUtils;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.util.Objects;
-
-/**
- * 多数据源处理
- *
- * @author ruoyi
- */
-@Aspect
-@Order(1)
-@Component
-public class DataSourceAspect {
-    protected Logger logger = LoggerFactory.getLogger(getClass());
-
-    @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)"
-            + "|| @within(com.ruoyi.common.annotation.DataSource)")
-    public void dsPointCut() {
-
-    }
-
-    @Around("dsPointCut()")
-    public Object around(ProceedingJoinPoint point) throws Throwable {
-        DataSource dataSource = getDataSource(point);
-
-        if (StringUtils.isNotNull(dataSource)) {
-            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
-        }
-
-        try {
-            return point.proceed();
-        } finally {
-            // 销毁数据源 在执行方法之后
-            DynamicDataSourceContextHolder.clearDataSourceType();
-        }
-    }
-
-    /**
-     * 获取需要切换的数据源
-     */
-    public DataSource getDataSource(ProceedingJoinPoint point) {
-        MethodSignature signature = (MethodSignature) point.getSignature();
-        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
-        if (Objects.nonNull(dataSource)) {
-            return dataSource;
-        }
-
-        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
-    }
-}

+ 2 - 50
ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java

@@ -1,71 +1,22 @@
 package com.ruoyi.framework.config;
 
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 import com.alibaba.druid.util.Utils;
-import com.ruoyi.common.enums.DataSourceType;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.framework.config.properties.DruidProperties;
-import com.ruoyi.framework.datasource.DynamicDataSource;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
 
 import javax.servlet.*;
-import javax.sql.DataSource;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
- * druid 配置多数据源
+ * druid
  *
  * @author ruoyi
  */
 @Configuration
 public class DruidConfig {
-    @Bean
-    @ConfigurationProperties("spring.datasource.druid.master")
-    public DataSource masterDataSource(DruidProperties druidProperties) {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean
-    @ConfigurationProperties("spring.datasource.druid.slave")
-    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
-    public DataSource slaveDataSource(DruidProperties druidProperties) {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean(name = "dynamicDataSource")
-    @Primary
-    public DynamicDataSource dataSource(DataSource masterDataSource) {
-        Map<Object, Object> targetDataSources = new HashMap<>();
-        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
-        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
-        return new DynamicDataSource(masterDataSource, targetDataSources);
-    }
-
-    /**
-     * 设置数据源
-     *
-     * @param targetDataSources 备选数据源集合
-     * @param sourceName        数据源名称
-     * @param beanName          bean名称
-     */
-    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName) {
-        try {
-            DataSource dataSource = SpringUtils.getBean(beanName);
-            targetDataSources.put(sourceName, dataSource);
-        } catch (Exception e) {
-        }
-    }
 
     /**
      * 去除监控页面底部的广告
@@ -109,4 +60,5 @@ public class DruidConfig {
         registrationBean.addUrlPatterns(commonJsPattern);
         return registrationBean;
     }
+
 }

+ 0 - 87
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java

@@ -1,87 +0,0 @@
-package com.ruoyi.framework.config.properties;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * druid 配置属性
- *
- * @author ruoyi
- */
-@Configuration
-public class DruidProperties {
-    @Value("${spring.datasource.druid.initialSize}")
-    private int initialSize;
-
-    @Value("${spring.datasource.druid.minIdle}")
-    private int minIdle;
-
-    @Value("${spring.datasource.druid.maxActive}")
-    private int maxActive;
-
-    @Value("${spring.datasource.druid.maxWait}")
-    private int maxWait;
-
-    @Value("${spring.datasource.druid.connectTimeout}")
-    private int connectTimeout;
-
-    @Value("${spring.datasource.druid.socketTimeout}")
-    private int socketTimeout;
-
-    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
-    private int timeBetweenEvictionRunsMillis;
-
-    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
-    private int minEvictableIdleTimeMillis;
-
-    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
-    private int maxEvictableIdleTimeMillis;
-
-    @Value("${spring.datasource.druid.validationQuery}")
-    private String validationQuery;
-
-    @Value("${spring.datasource.druid.testWhileIdle}")
-    private boolean testWhileIdle;
-
-    @Value("${spring.datasource.druid.testOnBorrow}")
-    private boolean testOnBorrow;
-
-    @Value("${spring.datasource.druid.testOnReturn}")
-    private boolean testOnReturn;
-
-    public DruidDataSource dataSource(DruidDataSource datasource) {
-        /** 配置初始化大小、最小、最大 */
-        datasource.setInitialSize(initialSize);
-        datasource.setMaxActive(maxActive);
-        datasource.setMinIdle(minIdle);
-
-        /** 配置获取连接等待超时的时间 */
-        datasource.setMaxWait(maxWait);
-
-        /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */
-        datasource.setConnectTimeout(connectTimeout);
-
-        /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */
-        datasource.setSocketTimeout(socketTimeout);
-
-        /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
-        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
-
-        /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
-        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
-        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
-
-        /**
-         * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
-         */
-        datasource.setValidationQuery(validationQuery);
-        /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
-        datasource.setTestWhileIdle(testWhileIdle);
-        /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-        datasource.setTestOnBorrow(testOnBorrow);
-        /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-        datasource.setTestOnReturn(testOnReturn);
-        return datasource;
-    }
-}

+ 0 - 24
ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java

@@ -1,24 +0,0 @@
-package com.ruoyi.framework.datasource;
-
-import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-import javax.sql.DataSource;
-import java.util.Map;
-
-/**
- * 动态数据源
- *
- * @author ruoyi
- */
-public class DynamicDataSource extends AbstractRoutingDataSource {
-    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
-        super.setDefaultTargetDataSource(defaultTargetDataSource);
-        super.setTargetDataSources(targetDataSources);
-        super.afterPropertiesSet();
-    }
-
-    @Override
-    protected Object determineCurrentLookupKey() {
-        return DynamicDataSourceContextHolder.getDataSourceType();
-    }
-}

+ 0 - 44
ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java

@@ -1,44 +0,0 @@
-package com.ruoyi.framework.datasource;
-
-import cn.hutool.core.util.ObjectUtil;
-import com.ruoyi.common.enums.DataSourceType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 数据源切换处理
- *
- * @author ruoyi
- */
-public class DynamicDataSourceContextHolder {
-    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
-
-    /**
-     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
-     * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
-     */
-    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
-
-    /**
-     * 获得数据源的变量
-     */
-    public static String getDataSourceType() {
-        return ObjectUtil.defaultIfNull(CONTEXT_HOLDER.get(), DataSourceType.MASTER.name());
-    }
-
-    /**
-     * 设置数据源的变量
-     */
-    public static void setDataSourceType(String dsType) {
-        log.info("切换到{}数据源", dsType);
-        CONTEXT_HOLDER.set(dsType);
-    }
-
-    /**
-     * 清空数据源变量
-     */
-    public static void clearDataSourceType() {
-        CONTEXT_HOLDER.remove();
-    }
-
-}

+ 8 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java

@@ -1,6 +1,8 @@
 package com.ruoyi.framework.manager.factory;
 
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.DatasourceConstant;
 import com.ruoyi.common.utils.LogUtils;
 import com.ruoyi.common.utils.ServletUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -62,6 +64,8 @@ public class AsyncFactory {
                 logininfor.setBrowser(browser);
                 logininfor.setOs(os);
                 logininfor.setMsg(message);
+
+                DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
                 // 日志状态
                 if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
                     logininfor.setStatus(Constants.SUCCESS);
@@ -70,6 +74,8 @@ public class AsyncFactory {
                 }
                 // 插入数据
                 SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
+
+                DynamicDataSourceContextHolder.clear();
             }
         };
     }
@@ -84,9 +90,11 @@ public class AsyncFactory {
         return new TimerTask() {
             @Override
             public void run() {
+                DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
                 // 远程查询操作地点
                 operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
                 SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
+                DynamicDataSourceContextHolder.clear();
             }
         };
     }

+ 9 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/MybatisPlusConfig.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
 import com.ruoyi.framework.mybatis.holder.CustomMetaObjectHandler;
 import com.ruoyi.framework.mybatis.interceptor.LogicInterceptor;
 import com.ruoyi.framework.mybatis.interceptor.TenantInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -23,6 +24,12 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @Configuration
 public class MybatisPlusConfig {
 
+    @Autowired
+    private TenantInterceptor tenantInterceptor;
+
+    @Autowired
+    private LogicInterceptor logicInterceptor;
+
     @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor() {
         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
@@ -31,9 +38,9 @@ public class MybatisPlusConfig {
         // 乐观锁插件
         interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
         // 拼接租户
-        interceptor.addInnerInterceptor(new TenantInterceptor());
+        interceptor.addInnerInterceptor(tenantInterceptor);
         // 拼接逻辑删除
-        interceptor.addInnerInterceptor(new LogicInterceptor());
+        interceptor.addInnerInterceptor(logicInterceptor);
         return interceptor;
     }
 

+ 23 - 30
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/interceptor/LogicInterceptor.java

@@ -1,15 +1,16 @@
 package com.ruoyi.framework.mybatis.interceptor;
 
-import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.stat.JdbcDataSourceStat;
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.baomidou.dynamic.datasource.ds.ItemDataSource;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
-import com.ruoyi.common.enums.DataSourceType;
-import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
 import com.ruoyi.framework.mybatis.holder.LogicHolder;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.JSQLParserException;
@@ -38,6 +39,7 @@ import org.apache.ibatis.session.RowBounds;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.sql.DataSource;
 import java.sql.Connection;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -70,32 +72,23 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
      */
     private static final Map<String, List<String>> notIncludeLogicIdTableNameMap = new HashMap<>();
 
-    public LogicInterceptor() {
-        // 获取主库数据源
-        DruidDataSource masterDataSource = SpringUtil.getBean("masterDataSource");
-        putTableMap(masterDataSource, DataSourceType.MASTER);
-
-        DruidDataSource slaveDataSource = SpringUtil.getBean("slaveDataSource");
-        putTableMap(slaveDataSource, DataSourceType.SLAVE);
-    }
-
-    /**
-     * 添加不存在租户字段的表map
-     *
-     * @param dataSource     数据源
-     * @param dataSourceType 数据源类型
-     */
-    private void putTableMap(DruidDataSource dataSource, DataSourceType dataSourceType) {
-        // 获取链接url
-        String url = dataSource.getUrl();
-        // 获取数据库名
-        String dbName = url.split("/")[3].split("\\?")[0];
-        // 查询不包含租户字段的表名
-        String sql = "SELECT DISTINCT table_name FROM information_schema.COLUMNS WHERE table_schema = ? AND column_name != ?";
-        // 获取jdbc
-        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
-        List<String> notIncludeTenantIdTableNameList = jdbcTemplate.queryForList(sql, String.class, dbName, delFlagName);
-        notIncludeLogicIdTableNameMap.put(dataSourceType.name(), notIncludeTenantIdTableNameList);
+    public LogicInterceptor(DataSource dataSource) {
+        DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource) dataSource;
+        Map<String, DataSource> dataSources = dynamicRoutingDataSource.getDataSources();
+        dataSources.forEach((k, v) -> {
+            // 获取dataSourceStat
+            JdbcDataSourceStat dataSourceStat = ((DruidDataSource) ((ItemDataSource) v).getRealDataSource()).getDataSourceStat();
+            // 获取链接url
+            String url = dataSourceStat.getUrl();
+            // 获取数据库名
+            String dbName = url.split("/")[3].split("\\?")[0];
+            // 查询包含逻辑删除字段的表名sql
+            String sql = "SELECT DISTINCT table_name FROM information_schema.COLUMNS WHERE table_schema = ? AND column_name != ?";
+            // 执行sql找出不包含逻辑删除字段的表名
+            List<String> notContainsDelFlagTableNameList = new JdbcTemplate(v).queryForList(sql, String.class, dbName, delFlagName);
+            // 数据赋值
+            notIncludeLogicIdTableNameMap.put(dataSourceStat.getName(), notContainsDelFlagTableNameList);
+        });
     }
 
     @Override
@@ -297,7 +290,7 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
         }
 
         // 执行sql的数据源名称
-        String dataSourceType = DynamicDataSourceContextHolder.getDataSourceType();
+        String dataSourceType = DynamicDataSourceContextHolder.peek();
         // 获取数据源中不包含逻辑删除字段的表名
         List<String> tableNameList = notIncludeLogicIdTableNameMap.get(dataSourceType);
         // 如果包涵则跳过拼接逻辑删除

+ 23 - 33
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/interceptor/TenantInterceptor.java

@@ -1,18 +1,20 @@
 package com.ruoyi.framework.mybatis.interceptor;
 
-import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.stat.JdbcDataSourceStat;
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.baomidou.dynamic.datasource.ds.ItemDataSource;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
-import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
 import com.ruoyi.framework.mybatis.holder.TenantHolder;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.StringValue;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.sql.DataSource;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -24,15 +26,23 @@ public class TenantInterceptor extends TenantLineInnerInterceptor {
 
     private static final Map<String, List<String>> notIncludeTenantIdTableNameMap = new ConcurrentHashMap<>();
 
-    public TenantInterceptor() {
-
-        // 获取主库数据源
-        DruidDataSource masterDataSource = SpringUtil.getBean("masterDataSource");
-        putTableMap(masterDataSource, DataSourceType.MASTER);
-
-        // 从库数据
-        DruidDataSource slaveDataSource = SpringUtil.getBean("slaveDataSource");
-        putTableMap(slaveDataSource, DataSourceType.SLAVE);
+    public TenantInterceptor(DataSource dataSource) {
+        DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource) dataSource;
+        Map<String, DataSource> dataSources = dynamicRoutingDataSource.getDataSources();
+        dataSources.forEach((k, v) -> {
+            // 获取dataSourceStat
+            JdbcDataSourceStat dataSourceStat = ((DruidDataSource) ((ItemDataSource) v).getRealDataSource()).getDataSourceStat();
+            // 获取链接url
+            String url = dataSourceStat.getUrl();
+            // 获取数据库名
+            String dbName = url.split("/")[3].split("\\?")[0];
+            // 查询包含逻辑删除字段的表名sql
+            String sql = "SELECT DISTINCT table_name FROM information_schema.COLUMNS WHERE table_schema = ? AND column_name != ?";
+            // 执行sql找出不包含逻辑删除字段的表名
+            List<String> notContainsDelFlagTableNameList = new JdbcTemplate(v).queryForList(sql, String.class, dbName, TenantName);
+            // 数据赋值
+            notIncludeTenantIdTableNameMap.put(dataSourceStat.getName(), notContainsDelFlagTableNameList);
+        });
 
         setTenantLineHandler(new TenantLineHandler() {
 
@@ -55,7 +65,7 @@ public class TenantInterceptor extends TenantLineInnerInterceptor {
                 }
 
                 // 获取当前线程处理的数据源类型
-                String dataSourceType = DynamicDataSourceContextHolder.getDataSourceType();
+                String dataSourceType = DynamicDataSourceContextHolder.peek();
                 // 获取当前数据原中不包涵租户字段的表名
                 List<String> tableNameList = notIncludeTenantIdTableNameMap.get(dataSourceType);
                 return tableNameList.contains(tableName);
@@ -64,24 +74,4 @@ public class TenantInterceptor extends TenantLineInnerInterceptor {
         });
     }
 
-    /**
-     * 添加不存在租户字段的表map
-     *
-     * @param dataSource     数据源
-     * @param dataSourceType 数据源类型
-     */
-    private void putTableMap(DruidDataSource dataSource, DataSourceType dataSourceType) {
-        // 获取链接url
-        String url = dataSource.getUrl();
-        // 获取数据库名
-        String dbName = url.split("/")[3].split("\\?")[0];
-        // 查询不包含租户字段的表名
-        String sql = "SELECT DISTINCT table_name FROM information_schema.COLUMNS WHERE table_schema = ? AND column_name != ?";
-        // 获取jdbc
-        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
-        List<String> notIncludeTenantIdTableNameList = jdbcTemplate.queryForList(sql, String.class, dbName, TenantName);
-        notIncludeTenantIdTableNameMap.put(dataSourceType.name(), notIncludeTenantIdTableNameList);
-    }
-
-
 }

+ 5 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java

@@ -1,12 +1,12 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.annotation.DataSource;
 import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.constant.DatasourceConstant;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.SysConfig;
@@ -35,7 +35,9 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
      */
     @PostConstruct
     public void init() {
+        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
         loadingConfigCache();
+        DynamicDataSourceContextHolder.clear();
     }
 
     /**
@@ -45,7 +47,6 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
      * @return 参数配置信息
      */
     @Override
-    @DataSource(DataSourceType.MASTER)
     public SysConfig selectConfigById(Long configId) {
         SysConfig config = new SysConfig();
         config.setConfigId(configId);
@@ -205,4 +206,5 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
     private String getCacheKey(String configKey) {
         return CacheConstants.SYS_CONFIG_KEY + configKey;
     }
+
 }

+ 5 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.constant.DatasourceConstant;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.domain.entity.SysDictType;
@@ -39,7 +41,9 @@ public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDi
      */
     @PostConstruct
     public void init() {
+        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
         loadingDictCache();
+        DynamicDataSourceContextHolder.clear();
     }
 
     /**
@@ -201,4 +205,5 @@ public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDi
         }
         return UserConstants.UNIQUE;
     }
+
 }