Browse Source

DataSource

fanxp 1 year ago
parent
commit
175a5dc025

+ 5 - 5
pom.xml

@@ -280,11 +280,11 @@
         </dependency>
 
         <!-- 动态数据源 -->
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-            <version>${mybatisplus.dynamic.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
+<!--            <version>${mybatisplus.dynamic.version}</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.qiniu</groupId>

+ 40 - 34
src/main/java/com/xjrsoft/common/utils/DatasourceUtil.java

@@ -5,9 +5,7 @@ import cn.hutool.db.DbUtil;
 import cn.hutool.db.Page;
 import cn.hutool.db.ds.simple.SimpleDataSource;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.alibaba.druid.pool.DruidDataSource;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import com.xjrsoft.common.constant.GlobalConstant;
@@ -35,15 +33,16 @@ import java.util.List;
 @Slf4j
 public class DatasourceUtil {
 
-
     /**
      * 获取主数据源
      *
      * @return
      */
     public static DataSource getDatasourceMaster() {
-        DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
-        return dynamicRoutingDataSource.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+//        DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
+//        return dynamicRoutingDataSource.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        DruidDataSource druidDataSource = SpringUtil.getBean(DruidDataSource.class);
+        return druidDataSource;
     }
 
     /**
@@ -52,20 +51,26 @@ public class DatasourceUtil {
      * @return
      */
     public static DataSource getDataSource(String id) {
-        DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
-        try {
-            return dynamicRoutingDataSource.getDataSource(id);
-        } catch (Exception e) {
-            throw new RuntimeException("获取数据源失败: " + id);
-        }
+//        DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
+//        try {
+//            return dynamicRoutingDataSource.getDataSource(id);
+//        } catch (Exception e) {
+//            throw new RuntimeException("获取数据源失败: " + id);
+//        }
+        DruidDataSource druidDataSource = SpringUtil.getBean(DruidDataSource.class);
+        return druidDataSource;
     }
 
     public static DbType getDataSourceMasterDbType() {
-        DynamicDataSourceProperties dynamicDataSourceProperties = SpringUtil.getBean(DynamicDataSourceProperties.class);
-        DataSourceProperty datasource = dynamicDataSourceProperties.getDatasource().get(dynamicDataSourceProperties.getPrimary());
-        return JdbcUtils.getDbType(datasource.getUrl());
+//        DynamicDataSourceProperties dynamicDataSourceProperties = SpringUtil.getBean(DynamicDataSourceProperties.class);
+//        DataSourceProperty datasource = dynamicDataSourceProperties.getDatasource().get(dynamicDataSourceProperties.getPrimary());
+        String url = getDruidDataSource().getUrl();
+        return JdbcUtils.getDbType(url);
     }
 
+    public static DruidDataSource getDruidDataSource() {
+        return SpringUtil.getBean(DruidDataSource.class);
+    }
 
 
     /**
@@ -115,7 +120,7 @@ public class DatasourceUtil {
     }
 
     private static String wrapperPageSqlForMysql(String sql, Page page) {
-        return "select * from (" + sql + ") t" + " limit " + PageUtil.getStart(page.getPageNumber(), page.getPageSize()) + "," +page.getPageSize();
+        return "select * from (" + sql + ") t" + " limit " + PageUtil.getStart(page.getPageNumber(), page.getPageSize()) + "," + page.getPageSize();
     }
 
     private static String wrapperPageSqlForOracle(String sql, Page page) {
@@ -230,16 +235,16 @@ public class DatasourceUtil {
                         break;
                     //长文本
                     case VARCHARMAX:
-                    //数字
+                        //数字
                     case INT:
                     case FLOAT:
-                    //日期
+                        //日期
                     case DATE:
-                    //日期时间
+                        //日期时间
                     case DATETIME:
-                    //长数字
+                        //长数字
                     case LONG:
-                    //长数字
+                        //长数字
                     case TIME:
                         sb.append("    `").append(tableFieldConfig.getFieldName()).append("` ").append(type).append(" COMMENT '").append(tableFieldConfig.getFieldComment()).append("', \n");
                         break;
@@ -252,7 +257,7 @@ public class DatasourceUtil {
 
 
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
-            if(!tableStructureConfig.getIsMain()){
+            if (!tableStructureConfig.getIsMain()) {
                 sb.append("  `").append(GlobalConstant.DEFAULT_FK).append("` bigint , \n");
             }
 
@@ -310,7 +315,7 @@ public class DatasourceUtil {
                     //日期
                     case DATE:
                     case DATETIME:
-                    // 时间
+                        // 时间
                     case TIME:
                         sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append(",  \n");
                         break;
@@ -321,7 +326,7 @@ public class DatasourceUtil {
 
             }
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
-            if(!tableStructureConfig.getIsMain()){
+            if (!tableStructureConfig.getIsMain()) {
                 sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" NUMBER(20, 0), \n");
             }
 
@@ -368,14 +373,14 @@ public class DatasourceUtil {
                         break;
                     //数字
                     case INT:
-                    //小数
+                        //小数
                     case FLOAT:
-                    //日期
+                        //日期
                     case DATE:
                     case DATETIME:
-                    //长数字
+                        //长数字
                     case LONG:
-                    // 时间
+                        // 时间
                     case TIME:
                         sb.append(tableFieldConfig.getFieldName()).append(" ").append(type).append(",  \n");
                         break;
@@ -387,7 +392,7 @@ public class DatasourceUtil {
             }
 
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
-            if(!tableStructureConfig.getIsMain()){
+            if (!tableStructureConfig.getIsMain()) {
                 sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" bigint , \n");
             }
 
@@ -428,13 +433,13 @@ public class DatasourceUtil {
                         break;
                     //长文本
                     case VARCHARMAX:
-                    //数字
+                        //数字
                     case INT:
-                    //长数字
+                        //长数字
                     case LONG:
-                    //小数
+                        //小数
                     case FLOAT:
-                    //日期
+                        //日期
                     case DATE:
                     case DATETIME:
                     case TIME:
@@ -447,7 +452,7 @@ public class DatasourceUtil {
 
             }
             //如果不是主表 默认需要新增主表关联字段 用于关联主表  默认字段名为 parent + _id
-            if(!tableStructureConfig.getIsMain()){
+            if (!tableStructureConfig.getIsMain()) {
                 sb.append("  ").append(GlobalConstant.DEFAULT_FK).append(" ").append(PostgreSqlFieldsType.FK.getType()).append(" , \n");
             }
 
@@ -468,6 +473,7 @@ public class DatasourceUtil {
 
     /**
      * 构建 判断表是否存在的sql
+     *
      * @param tableName
      * @param dbType
      * @return

+ 128 - 146
src/main/java/com/xjrsoft/config/MybatisPlusConfig.java

@@ -1,44 +1,26 @@
 
 package com.xjrsoft.config;
 
-import cn.hutool.core.convert.Convert;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.db.GlobalDbConfig;
-import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider;
-import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig;
 import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
-import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.handler.MyLocalDateTimeTypeHandler;
 import com.xjrsoft.common.handler.XjrLocalTimeTypeHandler;
 import com.xjrsoft.common.interceptor.DataScopeInnerInterceptor;
-import com.xjrsoft.common.utils.DatasourceUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.type.BooleanTypeHandler;
 import org.apache.ibatis.type.EnumTypeHandler;
 import org.apache.ibatis.type.JdbcType;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource;
 
-import javax.sql.DataSource;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 
 
 /**
@@ -50,8 +32,8 @@ import java.util.Properties;
 @Configuration
 public class MybatisPlusConfig {
 
-    @Autowired
-    private DynamicDataSourceProperties dynamicDataSourceProperties;
+//    @Autowired
+//    private DynamicDataSourceProperties dynamicDataSourceProperties;
 
     private final Map<String, String> datasourceMap = new HashMap<>();
 
@@ -86,138 +68,138 @@ public class MybatisPlusConfig {
         return interceptor;
     }
 
-    @Bean
-    public DynamicDataSourceProvider dynamicDataSourceProvider() {
-        GlobalDbConfig.setCaseInsensitive(false);    // 自定义表单hutool包配置,查询表单发布的菜单数据,设置返回的字段名大小写敏感
-        DataSourceProperty datasource = dynamicDataSourceProperties.getDatasource().get(GlobalConstant.DEFAULT_DATASOURCE_KEY);
-        return new AbstractJdbcDataSourceProvider(datasource.getDriverClassName(), datasource.getUrl(), datasource.getUsername(), datasource.getPassword()) {
-
-            @Override
-            protected Map<String, DataSourceProperty> executeStmt(Statement statement) throws SQLException {
-                Map<String, DataSourceProperty> map = new HashMap<>(16);
-
-                // 数据库里的所有库
-                ResultSet rs = statement.executeQuery("SELECT * FROM xjr_databaselink WHERE delete_mark = 0 AND enabled_mark = 1");
-                while (rs.next()) {
-                    long id = rs.getLong("id");
-                    String host = rs.getString("host");
-                    String username = rs.getString("username");
-                    String password = rs.getString("password");
-                    String driver = rs.getString("driver");
-                    String dbType = rs.getString("db_type");
-
-                    //缓存起来
-                    datasourceMap.put(Convert.toStr(id), rs.getString("db_name"));
-
-                    DataSourceProperty property = new DataSourceProperty();
-                    property.setUsername(username);
-                    property.setPassword(password);
-                    property.setUrl(host);
-                    property.setDriverClassName(driver);
-                    // 测试连接,如果连接不上则跳过,避免启动失败
-                    if (!DatasourceUtil.testConnection(host, username, password)) {
-                        continue;
-                    }
-
-                    DruidConfig druidConfig = property.getDruid();
-                    druidConfig.setInitialSize(10); // 初始化大小
-                    druidConfig.setMaxActive(100);// 最大连接池
-                    druidConfig.setMinIdle(10);// 最小连接池
-                    druidConfig.setMaxWait(60000); //最大等待超时时间
-                    druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-                    druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-                    druidConfig.setTimeBetweenEvictionRunsMillis(60000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                    druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
-                    if (StrUtil.equals(dbType, "oracle")) {
-                        druidConfig.setValidationQuery("SELECT 1 FROM DUAL");
-                    } else {
-                        druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
-                    }
-                    druidConfig.setTestWhileIdle(true);
-                    druidConfig.setTestOnReturn(false);
-                    druidConfig.setTestOnBorrow(true);
-                    druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
-                    druidConfig.setUseGlobalDataSourceStat(true);
-                    Properties properties = new Properties();
-                    properties.put("druid.stat.mergeSql", true); //打开mergeSql功能
-                    properties.put("druid.stat.slowSqlMillis", true); // 打开慢sql 记录功能
-                    druidConfig.setConnectionProperties(properties);
-
-                    map.put(Long.toString(id), property);
-
-                }
-                // yml配置的数据源
-                Map<String, DataSourceProperty> datasourceMap = dynamicDataSourceProperties.getDatasource();
-                for (DataSourceProperty dataSourceProperty : datasourceMap.values()) {
-                    // 测试连接,如果连接不上则跳过,避免启动失败
-                    if (!DatasourceUtil.testConnection(dataSourceProperty.getUrl(), dataSourceProperty.getUsername(), dataSourceProperty.getPassword())) {
-                        continue;
-                    }
-
-                    DruidConfig druidConfig = dataSourceProperty.getDruid();
-                    druidConfig.setInitialSize(10); // 初始化大小
-                    druidConfig.setMaxActive(100);// 最大连接池
-                    druidConfig.setMinIdle(10);// 最小连接池
-                    druidConfig.setMaxWait(60000); //最大等待超时时间
-                    druidConfig.setValidationQueryTimeout(10);//是检测连接是否有效的超时时间,单位:秒
-                    druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-                    druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-                    druidConfig.setTimeBetweenEvictionRunsMillis(2000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-                    druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
-                    if (dataSourceProperty.getUrl().contains("oracle")) {
-                        druidConfig.setValidationQuery("SELECT 1 FROM DUAL"); //测试链接 如果是oracle 语句不一样
-                    } else {
-                        druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
-                    }
-                    druidConfig.setTestWhileIdle(true);
-                    druidConfig.setTestOnReturn(false);
-                    druidConfig.setTestOnBorrow(false);
-                    druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
-                    druidConfig.setUseGlobalDataSourceStat(true);
-                    Properties properties = new Properties();
-                    properties.put("druid.stat.mergeSql", true); //打开mergeSql功能
-                    properties.put("druid.stat.slowSqlMillis", true); // 打开慢sql 记录功能
-                    druidConfig.setConnectionProperties(properties);
-                }
-                map.putAll(datasourceMap);
-
-                rs.close();
-                return map;
-            }
-        };
-    }
+//    @Bean
+//    public DynamicDataSourceProvider dynamicDataSourceProvider() {
+//        GlobalDbConfig.setCaseInsensitive(false);    // 自定义表单hutool包配置,查询表单发布的菜单数据,设置返回的字段名大小写敏感
+//        DataSourceProperty datasource = dynamicDataSourceProperties.getDatasource().get(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+//        return new AbstractJdbcDataSourceProvider(datasource.getDriverClassName(), datasource.getUrl(), datasource.getUsername(), datasource.getPassword()) {
+//
+//            @Override
+//            protected Map<String, DataSourceProperty> executeStmt(Statement statement) throws SQLException {
+//                Map<String, DataSourceProperty> map = new HashMap<>(16);
+//
+//                // 数据库里的所有库
+//                ResultSet rs = statement.executeQuery("SELECT * FROM xjr_databaselink WHERE delete_mark = 0 AND enabled_mark = 1");
+//                while (rs.next()) {
+//                    long id = rs.getLong("id");
+//                    String host = rs.getString("host");
+//                    String username = rs.getString("username");
+//                    String password = rs.getString("password");
+//                    String driver = rs.getString("driver");
+//                    String dbType = rs.getString("db_type");
+//
+//                    //缓存起来
+//                    datasourceMap.put(Convert.toStr(id), rs.getString("db_name"));
+//
+//                    DataSourceProperty property = new DataSourceProperty();
+//                    property.setUsername(username);
+//                    property.setPassword(password);
+//                    property.setUrl(host);
+//                    property.setDriverClassName(driver);
+//                    // 测试连接,如果连接不上则跳过,避免启动失败
+//                    if (!DatasourceUtil.testConnection(host, username, password)) {
+//                        continue;
+//                    }
+//
+//                    DruidConfig druidConfig = property.getDruid();
+//                    druidConfig.setInitialSize(10); // 初始化大小
+//                    druidConfig.setMaxActive(100);// 最大连接池
+//                    druidConfig.setMinIdle(10);// 最小连接池
+//                    druidConfig.setMaxWait(60000); //最大等待超时时间
+//                    druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//                    druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//                    druidConfig.setTimeBetweenEvictionRunsMillis(60000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+//                    druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
+//                    if (StrUtil.equals(dbType, "oracle")) {
+//                        druidConfig.setValidationQuery("SELECT 1 FROM DUAL");
+//                    } else {
+//                        druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
+//                    }
+//                    druidConfig.setTestWhileIdle(true);
+//                    druidConfig.setTestOnReturn(false);
+//                    druidConfig.setTestOnBorrow(true);
+//                    druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+//                    druidConfig.setUseGlobalDataSourceStat(true);
+//                    Properties properties = new Properties();
+//                    properties.put("druid.stat.mergeSql", true); //打开mergeSql功能
+//                    properties.put("druid.stat.slowSqlMillis", true); // 打开慢sql 记录功能
+//                    druidConfig.setConnectionProperties(properties);
+//
+//                    map.put(Long.toString(id), property);
+//
+//                }
+//                // yml配置的数据源
+//                Map<String, DataSourceProperty> datasourceMap = dynamicDataSourceProperties.getDatasource();
+//                for (DataSourceProperty dataSourceProperty : datasourceMap.values()) {
+//                    // 测试连接,如果连接不上则跳过,避免启动失败
+//                    if (!DatasourceUtil.testConnection(dataSourceProperty.getUrl(), dataSourceProperty.getUsername(), dataSourceProperty.getPassword())) {
+//                        continue;
+//                    }
+//
+//                    DruidConfig druidConfig = dataSourceProperty.getDruid();
+//                    druidConfig.setInitialSize(10); // 初始化大小
+//                    druidConfig.setMaxActive(100);// 最大连接池
+//                    druidConfig.setMinIdle(10);// 最小连接池
+//                    druidConfig.setMaxWait(60000); //最大等待超时时间
+//                    druidConfig.setValidationQueryTimeout(10);//是检测连接是否有效的超时时间,单位:秒
+//                    druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//                    druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//                    druidConfig.setTimeBetweenEvictionRunsMillis(2000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+//                    druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
+//                    if (dataSourceProperty.getUrl().contains("oracle")) {
+//                        druidConfig.setValidationQuery("SELECT 1 FROM DUAL"); //测试链接 如果是oracle 语句不一样
+//                    } else {
+//                        druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
+//                    }
+//                    druidConfig.setTestWhileIdle(true);
+//                    druidConfig.setTestOnReturn(false);
+//                    druidConfig.setTestOnBorrow(false);
+//                    druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+//                    druidConfig.setUseGlobalDataSourceStat(true);
+//                    Properties properties = new Properties();
+//                    properties.put("druid.stat.mergeSql", true); //打开mergeSql功能
+//                    properties.put("druid.stat.slowSqlMillis", true); // 打开慢sql 记录功能
+//                    druidConfig.setConnectionProperties(properties);
+//                }
+//                map.putAll(datasourceMap);
+//
+//                rs.close();
+//                return map;
+//            }
+//        };
+//    }
 
     /**
      * 配置MagicApi多数据源
      *
      * @return
      */
-    @Bean
-    public MagicDynamicDataSource magicDynamicDataSource() {
-
-        MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
-
-        Map<String, DataSource> dataSources = dynamicDataSourceProvider().loadDataSources();
-        for (String ds : dataSources.keySet()) {
-            if (StrUtil.equals(GlobalConstant.DEFAULT_DATASOURCE_KEY, ds)) {
-                dynamicDataSource.setDefault(dataSources.get(ds));
-            } else {
-
-                //缓存起来的name
-                if (datasourceMap.containsKey(ds)) {
-                    String name = MapUtil.getStr(datasourceMap, ds);
-                    dynamicDataSource.add(name, dataSources.get(ds));
-                }
-                //配置在yml上的  可能获取不到name
-                else {
-                    dynamicDataSource.add("datasource_" + ds, dataSources.get(ds));
-                }
-
-            }
-        }
-
-        return dynamicDataSource;
-    }
+//    @Bean
+//    public MagicDynamicDataSource magicDynamicDataSource() {
+//
+//        MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
+//
+//        Map<String, DataSource> dataSources = dynamicDataSourceProvider().loadDataSources();
+//        for (String ds : dataSources.keySet()) {
+//            if (StrUtil.equals(GlobalConstant.DEFAULT_DATASOURCE_KEY, ds)) {
+//                dynamicDataSource.setDefault(dataSources.get(ds));
+//            } else {
+//
+//                //缓存起来的name
+//                if (datasourceMap.containsKey(ds)) {
+//                    String name = MapUtil.getStr(datasourceMap, ds);
+//                    dynamicDataSource.add(name, dataSources.get(ds));
+//                }
+//                //配置在yml上的  可能获取不到name
+//                else {
+//                    dynamicDataSource.add("datasource_" + ds, dataSources.get(ds));
+//                }
+//
+//            }
+//        }
+//
+//        return dynamicDataSource;
+//    }
 
     /**
      * MybatisPlus数据库类型处理

+ 0 - 2
src/main/java/com/xjrsoft/module/form/service/impl/FormExecuteServiceImpl.java

@@ -1844,7 +1844,6 @@ public class FormExecuteServiceImpl implements IFormExecuteService {
         return pageOutput;
     }
 
-
     /**
      * 根据配置信息获取分页列表数据
      *
@@ -1937,7 +1936,6 @@ public class FormExecuteServiceImpl implements IFormExecuteService {
         return pageOutput;
     }
 
-
     /**
      * 根据配置信息获取表单数据
      *

+ 16 - 18
src/main/java/com/xjrsoft/module/system/controller/DatabaselinkController.java

@@ -5,8 +5,6 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.db.meta.Column;
 import cn.hutool.db.meta.MetaUtil;
 import cn.hutool.db.meta.Table;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -68,7 +66,7 @@ public class DatabaselinkController {
 
     private final IDatabaselinkService databaselinkService;
 
-    private final DynamicDataSourceProperties dataSourceProperties;
+//    private final DynamicDataSourceProperties dataSourceProperties;
 
     /**
      * 分页
@@ -98,26 +96,26 @@ public class DatabaselinkController {
                     .select(Databaselink.class,x -> VoToColumnUtil.fieldsToColumns(DatabaselinkPageVo.class).contains(x.getProperty()));
         List<Databaselink> databaseLinkList = databaselinkService.list(queryWrapper);
         List<DatabaseLinkListVo> resultList = new ArrayList<>();
-        resultList.add(BeanUtil.toBean(masterInfo().getData(), DatabaseLinkListVo.class));
+//        resultList.add(BeanUtil.toBean(masterInfo().getData(), DatabaseLinkListVo.class));
         resultList.addAll(BeanUtil.copyToList(databaseLinkList, DatabaseLinkListVo.class));
         return R.ok(resultList);
     }
 
 
-    @GetMapping("/master-info")
-    @ApiOperation(value = "查询主数据库链接详情")
-    public R masterInfo() {
-        DatabaseLinkVo vo = new DatabaseLinkVo();
-        String primary = dataSourceProperties.getPrimary();
-        vo.setId(primary);
-        vo.setDbName("默认数据库");
-        DataSourceProperty dataSourceProperty = dataSourceProperties.getDatasource().get(primary);
-        vo.setDbType(JdbcUtils.getDbType(dataSourceProperty.getUrl()).getDb());
-        vo.setHost(dataSourceProperty.getUrl());
-        vo.setUsername(dataSourceProperty.getUsername());
-        vo.setDriver(dataSourceProperty.getDriverClassName());
-        return R.ok(vo);
-    }
+//    @GetMapping("/master-info")
+//    @ApiOperation(value = "查询主数据库链接详情")
+//    public R masterInfo() {
+//        DatabaseLinkVo vo = new DatabaseLinkVo();
+//        String primary = dataSourceProperties.getPrimary();
+//        vo.setId(primary);
+//        vo.setDbName("默认数据库");
+//        DataSourceProperty dataSourceProperty = dataSourceProperties.getDatasource().get(primary);
+//        vo.setDbType(JdbcUtils.getDbType(dataSourceProperty.getUrl()).getDb());
+//        vo.setHost(dataSourceProperty.getUrl());
+//        vo.setUsername(dataSourceProperty.getUsername());
+//        vo.setDriver(dataSourceProperty.getDriverClassName());
+//        return R.ok(vo);
+//    }
 
     @GetMapping("/info")
     @ApiOperation(value = "查询数据库链接详情")

+ 51 - 61
src/main/java/com/xjrsoft/module/system/service/impl/DatabaselinkServiceImpl.java

@@ -9,16 +9,10 @@ import cn.hutool.db.meta.Column;
 import cn.hutool.db.meta.MetaUtil;
 import cn.hutool.db.meta.Table;
 import cn.hutool.db.meta.TableType;
-import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
-import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.datasource.MyColumnInfo;
 import com.xjrsoft.common.model.datasource.MyTableInfo;
@@ -29,6 +23,7 @@ import com.xjrsoft.module.system.dto.UpdateDatabaseLinkDto;
 import com.xjrsoft.module.system.entity.Databaselink;
 import com.xjrsoft.module.system.mapper.DatabaselinkMapper;
 import com.xjrsoft.module.system.service.IDatabaselinkService;
+import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import oracle.jdbc.OracleConnection;
@@ -39,13 +34,7 @@ import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -60,11 +49,11 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class DatabaselinkServiceImpl extends ServiceImpl<DatabaselinkMapper, Databaselink> implements IDatabaselinkService {
 
-    private final DynamicRoutingDataSource routingDataSource;
-
-    private final DruidDataSourceCreator druidDataSourceCreator;
-
-    private final DynamicDataSourceProperties dynamicDataSourceProperties;
+//    private final DynamicRoutingDataSource routingDataSource;
+//
+//    private final DruidDataSourceCreator druidDataSourceCreator;
+//
+//    private final DynamicDataSourceProperties dynamicDataSourceProperties;
 
     @Override
     public Boolean add(AddDatabaseLinkDto dto) {
@@ -97,7 +86,7 @@ public class DatabaselinkServiceImpl extends ServiceImpl<DatabaselinkMapper, Dat
         }
 
         // 删除动态数据源
-        routingDataSource.removeDataSource(StrUtil.toString(dto.getId()));
+//        routingDataSource.removeDataSource(StrUtil.toString(dto.getId()));
         // 添加动态数据源
         addDynamicDataSource(databaselink);
         return Boolean.TRUE;
@@ -262,52 +251,53 @@ public class DatabaselinkServiceImpl extends ServiceImpl<DatabaselinkMapper, Dat
      */
     private void addDynamicDataSource(Databaselink databaselink){
 
-        DataSourceProperty property = new DataSourceProperty();
-        property.setUsername(databaselink.getUsername());
-        property.setPassword(databaselink.getPassword());
-        property.setUrl(databaselink.getHost());
-        property.setDriverClassName(databaselink.getDriver());
-
-
-        DruidConfig druidConfig = property.getDruid();
-        druidConfig.setInitialSize(10); // 初始化大小
-        druidConfig.setMaxActive(100);// 最大连接池
-        druidConfig.setMinIdle(10);// 最小连接池
-        druidConfig.setMaxWait(60000); //最大等待超时时间
-        druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-        druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
-        druidConfig.setTimeBetweenEvictionRunsMillis(60000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-        druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
-        if(property.getUrl().contains("oracle")){
-            druidConfig.setValidationQuery("SELECT 1 FROM DUAL");
-        }
-        else{
-            druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
-        }
-        druidConfig.setTestWhileIdle(true);
-        druidConfig.setTestOnReturn(false);
-        druidConfig.setTestOnBorrow(true);
-        druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
-        druidConfig.setUseGlobalDataSourceStat(true);
-        Properties properties =new Properties();
-        properties.put("druid.stat.mergeSql",true); //打开mergeSql功能
-        properties.put("druid.stat.slowSqlMillis",true); // 打开慢sql 记录功能
-        druidConfig.setConnectionProperties(properties);
-
-        DataSource dataSource = druidDataSourceCreator.createDataSource(property);
-        routingDataSource.addDataSource(StrUtil.toString(databaselink.getId()), dataSource);
+//        DataSourceProperty property = new DataSourceProperty();
+//        property.setUsername(databaselink.getUsername());
+//        property.setPassword(databaselink.getPassword());
+//        property.setUrl(databaselink.getHost());
+//        property.setDriverClassName(databaselink.getDriver());
+//
+//
+//        DruidConfig druidConfig = property.getDruid();
+//        druidConfig.setInitialSize(10); // 初始化大小
+//        druidConfig.setMaxActive(100);// 最大连接池
+//        druidConfig.setMinIdle(10);// 最小连接池
+//        druidConfig.setMaxWait(60000); //最大等待超时时间
+//        druidConfig.setPoolPreparedStatements(false); // 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//        druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);//是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
+//        druidConfig.setTimeBetweenEvictionRunsMillis(60000L);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+//        druidConfig.setMinEvictableIdleTimeMillis(300000L); //  配置一个连接在池中最小生存的时间,单位是毫秒
+//        if(property.getUrl().contains("oracle")){
+//            druidConfig.setValidationQuery("SELECT 1 FROM DUAL");
+//        }
+//        else{
+//            druidConfig.setValidationQuery("SELECT 1 "); //测试链接 语句
+//        }
+//        druidConfig.setTestWhileIdle(true);
+//        druidConfig.setTestOnReturn(false);
+//        druidConfig.setTestOnBorrow(true);
+//        druidConfig.setFilters("stat,slf4j"); // #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+//        druidConfig.setUseGlobalDataSourceStat(true);
+//        Properties properties =new Properties();
+//        properties.put("druid.stat.mergeSql",true); //打开mergeSql功能
+//        properties.put("druid.stat.slowSqlMillis",true); // 打开慢sql 记录功能
+//        druidConfig.setConnectionProperties(properties);
+//
+//        DataSource dataSource = druidDataSourceCreator.createDataSource(property);
+//        routingDataSource.addDataSource(StrUtil.toString(databaselink.getId()), dataSource);
     }
 
     public DbType getDbType(String id) {
         String url = null;
-        if (StrUtil.equalsIgnoreCase(id, dynamicDataSourceProperties.getPrimary())) {
-            url = dynamicDataSourceProperties.getDatasource().get(dynamicDataSourceProperties.getPrimary()).getUrl();
-        } else {
-            Databaselink databaselink = this.getById(id);
-            if (databaselink != null) {
-                url = databaselink.getHost();
-            }
-        }
+//        if (StrUtil.equalsIgnoreCase(id, dynamicDataSourceProperties.getPrimary())) {
+//            url = dynamicDataSourceProperties.getDatasource().get(dynamicDataSourceProperties.getPrimary()).getUrl();
+//        } else {
+//            Databaselink databaselink = this.getById(id);
+//            if (databaselink != null) {
+//                url = databaselink.getHost();
+//            }
+//        }
+        url = DatasourceUtil.getDruidDataSource().getUrl();
         return JdbcUtils.getDbType(url);
     }
 }

+ 12 - 8
src/main/resources/application-dev.yml

@@ -4,14 +4,18 @@ spring:
     exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
-    dynamic:
-      primary: master
-      datasource:
-        master:
-          driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://10.150.10.139:3306/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false
-          username: root
-          password: Zwr~-f6H,u6QE^]C-AD_
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://10.150.10.139:3306/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false
+    username: root
+    password: Zwr~-f6H,u6QE^]C-AD_
+#    dynamic:
+#      primary: master
+#      datasource:
+#        master:
+#          driver-class-name: com.mysql.cj.jdbc.Driver
+#          url: jdbc:mysql://10.150.10.139:3306/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false
+#          username: root
+#          password: Zwr~-f6H,u6QE^]C-AD_
 
   redis:
     database: 11

+ 0 - 6
src/test/java/com/xjrsoft/xjrsoftboot/DynamicDatasourceTest.java

@@ -1,19 +1,14 @@
 package com.xjrsoft.xjrsoftboot;
 
 
-import cn.hutool.db.Db;
-import cn.hutool.db.DbUtil;
 import cn.hutool.db.Entity;
 import cn.hutool.db.Session;
-import com.baomidou.dynamic.datasource.annotation.DSTransactional;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.xjrsoft.XjrSoftApplication;
 import com.xjrsoft.common.utils.DatasourceUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -29,7 +24,6 @@ import java.sql.SQLException;
 public class DynamicDatasourceTest {
 
     @Test
-    @DSTransactional
     public void testMultiTask() throws SQLException {
 
         DataSource datasourceMaster = DatasourceUtil.getDatasourceMaster();

+ 0 - 1
src/test/java/com/xjrsoft/xjrsoftboot/FileReceiveServiceImplTest.java

@@ -1,6 +1,5 @@
 package com.xjrsoft.xjrsoftboot;
 
-import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.xjrsoft.XjrSoftApplication;
 import com.xjrsoft.module.oa.service.IFileReceiveService;
 import org.junit.Test;