Browse Source

1.动态数据源切换
2.动态添加数据源

heqinwei 7 years ago
parent
commit
41cc52f5f3

+ 4 - 1
src/main/java/com/Application.java

@@ -1,14 +1,17 @@
 package com;
 package com;
 
 
 import com.util.BasesSource.DynamicDataSourceRegister;
 import com.util.BasesSource.DynamicDataSourceRegister;
+import com.util.ContextUtil;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Import;
 
 
 @SpringBootApplication
 @SpringBootApplication
 @Import({DynamicDataSourceRegister.class})
 @Import({DynamicDataSourceRegister.class})
 public class Application {
 public class Application {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(Application.class, args);
+        ApplicationContext app = SpringApplication.run(Application.class, args);
+        ContextUtil.setApplicationContext(app);
     }
     }
 }
 }

+ 8 - 0
src/main/java/com/dao/DataConnectorMapper.java

@@ -3,6 +3,7 @@ package com.dao;
 import com.model.po.DataConnector;
 import com.model.po.DataConnector;
 import com.model.po.DataConnectorList;
 import com.model.po.DataConnectorList;
 import com.model.po.Databases;
 import com.model.po.Databases;
+import com.model.vo.configVo.DatabasesInfo;
 import com.model.vo.configVo.GroupInfo;
 import com.model.vo.configVo.GroupInfo;
 import org.apache.ibatis.annotations.*;
 import org.apache.ibatis.annotations.*;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
@@ -106,6 +107,13 @@ public interface DataConnectorMapper {
     @Select("select pass_word from BI_DATABASES where  id= #{id}")
     @Select("select pass_word from BI_DATABASES where  id= #{id}")
     String getBasesById(int id);
     String getBasesById(int id);
 
 
+    /*
+    查询单个数据库连接
+     */
+    @Select("select bases_name as name, note, addrass, data_name as dataName, DATABASE_TYPE as databaseType," +
+            " PASS_WORD as passWord, USER_NAME as userName, PORT, CREATE_DATE as createDate from bi_databases where id = #{id}")
+    DatabasesInfo getDatabases(int id);
+
     /*
     /*
     查询数据库配置列表
     查询数据库配置列表
      */
      */

+ 35 - 4
src/main/java/com/server/DataBasesService.java

@@ -11,15 +11,17 @@ import com.model.pojo.RepCode;
 import com.model.pojo.RepEntity;
 import com.model.pojo.RepEntity;
 import com.model.vo.configVo.ColumnRenameInfo;
 import com.model.vo.configVo.ColumnRenameInfo;
 import com.model.vo.configVo.DatabasesInfo;
 import com.model.vo.configVo.DatabasesInfo;
+import com.util.BasesSource.DynamicDataSource;
+import com.util.BasesSource.DynamicDataSourceContextHolder;
+import com.util.BasesSource.DynamicDataSourceRegister;
+import com.util.ContextUtil;
 import com.util.TimeUtil;
 import com.util.TimeUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 
 @Service
 @Service
 public class DataBasesService {
 public class DataBasesService {
@@ -29,13 +31,19 @@ public class DataBasesService {
     TimeUtil timeUtil;
     TimeUtil timeUtil;
     @Autowired
     @Autowired
     ObjectMapper objectMapper;
     ObjectMapper objectMapper;
+    @Autowired
+    private DynamicDataSourceRegister dataSourceRegister;
     /*
     /*
    保存数据库连接
    保存数据库连接
     */
     */
+
     public RepEntity inputDatabases(DatabasesInfo databasesInfo){
     public RepEntity inputDatabases(DatabasesInfo databasesInfo){
         if (databasesInfo == null || "".equals(databasesInfo)){
         if (databasesInfo == null || "".equals(databasesInfo)){
             return new RepEntity(RepCode.Null);
             return new RepEntity(RepCode.Null);
         }
         }
+        //添加数据源可切换
+        addDataSource(databasesInfo);
+
         Databases databases = new Databases();
         Databases databases = new Databases();
         BeanUtils.copyProperties(databasesInfo, databases);
         BeanUtils.copyProperties(databasesInfo, databases);
         databases.setCreateDate(timeUtil.SystemTime());
         databases.setCreateDate(timeUtil.SystemTime());
@@ -46,6 +54,8 @@ public class DataBasesService {
         }
         }
         dataConnectorMapper.inputDataBases(databases);
         dataConnectorMapper.inputDataBases(databases);
         int id = databases.getId();
         int id = databases.getId();
+
+        //添加进数据库连接用于切换
         return new RepEntity(RepCode.success,id);
         return new RepEntity(RepCode.success,id);
     }
     }
 
 
@@ -89,6 +99,8 @@ public class DataBasesService {
         BeanUtils.copyProperties(databasesInfo, databases);
         BeanUtils.copyProperties(databasesInfo, databases);
         System.out.println(databases);
         System.out.println(databases);
         dataConnectorMapper.updatabases(databases);
         dataConnectorMapper.updatabases(databases);
+        DatabasesInfo databasesInfo1 = dataConnectorMapper.getDatabases(databasesInfo.getId());
+        addDataSource(databasesInfo1);
         return new RepEntity(RepCode.success);
         return new RepEntity(RepCode.success);
     }
     }
 
 
@@ -114,7 +126,6 @@ public class DataBasesService {
         }
         }
         List<ColumnToShow> toShows = new ArrayList<>();
         List<ColumnToShow> toShows = new ArrayList<>();
 
 
-//        Iterator isList = configList.iterator();
 
 
         for (int i = 0; i < configList.size(); i++ ){
         for (int i = 0; i < configList.size(); i++ ){
             ColumnRenameInfo columnRenameInfo = new ColumnRenameInfo();
             ColumnRenameInfo columnRenameInfo = new ColumnRenameInfo();
@@ -132,4 +143,24 @@ public class DataBasesService {
         return new RepEntity(RepCode.success,toShows);
         return new RepEntity(RepCode.success,toShows);
     }
     }
 
 
+    private void addDataSource(DatabasesInfo databasesInfo) {
+
+        //额外的数据源
+        Map<String, Object> dsMap = new HashMap<>();
+        dsMap.put("driver", "oracle.jdbc.driver.OracleDriver");
+        dsMap.put("url", "jdbc:oracle:thin:@" + databasesInfo.getAddrass() +":" + databasesInfo.getPort() + ":" + databasesInfo.getDataName());
+        dsMap.put("username", databasesInfo.getUserName());
+        dsMap.put("password", databasesInfo.getPassWord());
+        Map<Object, Object> target = dataSourceRegister.getTargetDataSources();
+//        if (target.size() == 0) {
+//            target.putAll(dataSourceRegister.getSlaveDataSources());
+//        }
+        target.put(databasesInfo.getUserName(), dataSourceRegister.buildDataSource(dsMap));
+        DynamicDataSource datasource = (DynamicDataSource) ContextUtil.getBean("dataSource");
+        datasource.setTargetDataSources(target);
+        datasource.afterPropertiesSet();
+
+        DynamicDataSourceContextHolder.dataSourceIds.add(databasesInfo.getUserName());
+    }
+
 }
 }

+ 96 - 22
src/main/java/com/util/BasesSource/DynamicDataSourceRegister.java

@@ -8,8 +8,10 @@ import org.springframework.context.EnvironmentAware;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.core.env.Environment;
 import org.springframework.core.env.Environment;
 import org.springframework.core.type.AnnotationMetadata;
 import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.stereotype.Component;
 
 
 import javax.sql.DataSource;
 import javax.sql.DataSource;
+import java.sql.*;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -20,7 +22,7 @@ import java.util.Map;
  * 初始化数据源和提供了执行动态切换数据源的工具类
  * 初始化数据源和提供了执行动态切换数据源的工具类
  * EnvironmentAware(获取配置文件配置的属性值)
  * EnvironmentAware(获取配置文件配置的属性值)
  */
  */
-
+@Component
 public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware {
 public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware {
 
 
 
 
@@ -31,43 +33,115 @@ public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar,
     //用户自定义数据源
     //用户自定义数据源
     private Map<String, DataSource> slaveDataSources = new HashMap<>();
     private Map<String, DataSource> slaveDataSources = new HashMap<>();
 
 
+    Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
+
+    public DataSource getDefaultDataSource() {
+        return defaultDataSource;
+    }
+
+    public void setDefaultDataSource(DataSource defaultDataSource) {
+        this.defaultDataSource = defaultDataSource;
+    }
+
+    public Map<String, DataSource> getSlaveDataSources() {
+        return slaveDataSources;
+    }
+
+    public void setSlaveDataSources(Map<String, DataSource> slaveDataSources) {
+        this.slaveDataSources = slaveDataSources;
+    }
+
+    public Map<Object, Object> getTargetDataSources() {
+        return targetDataSources;
+    }
+
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        this.targetDataSources = targetDataSources;
+    }
+
+    // 读取主数据源
+    Map<String, Object> dsDeMap = new HashMap<>();
+
     @Override
     @Override
     public void setEnvironment(Environment environment) {
     public void setEnvironment(Environment environment) {
         initDefaultDataSource(environment);
         initDefaultDataSource(environment);
-        initslaveDataSources(environment);
+        initslaveDataSources();
     }
     }
 
 
     private void initDefaultDataSource(Environment env) {
     private void initDefaultDataSource(Environment env) {
         // 读取主数据源
         // 读取主数据源
-        Map<String, Object> dsMap = new HashMap<>();
-        dsMap.put("driver", env.getProperty("spring.datasource.driver-class-name"));
-        dsMap.put("url", env.getProperty("spring.datasource.url"));
-        dsMap.put("username", env.getProperty("spring.datasource.username"));
-        dsMap.put("password", env.getProperty("spring.datasource.password"));
-        System.out.println("主数据源:" + dsMap);
-        defaultDataSource = buildDataSource(dsMap);
+        dsDeMap = new HashMap<>();
+        dsDeMap.put("driver", env.getProperty("spring.datasource.driver-class-name"));
+        dsDeMap.put("url", env.getProperty("spring.datasource.url"));
+        dsDeMap.put("username", env.getProperty("spring.datasource.username"));
+        dsDeMap.put("password", env.getProperty("spring.datasource.password"));
+        System.out.println("主数据源:" + dsDeMap);
+        defaultDataSource = buildDataSource(dsDeMap);
     }
     }
 
 
 
 
-    private void initslaveDataSources(Environment env) {
+    private void initslaveDataSources(){
         // 读取配置文件获取更多数据源
         // 读取配置文件获取更多数据源
-        String dsPrefixs = env.getProperty("slave.datasource.names");
-        for (String dsPrefix : dsPrefixs.split(",")) {
-            // 多个数据源
-            Map<String, Object> dsMap = new HashMap<>();
-            dsMap.put("driver", env.getProperty("slave.datasource." + dsPrefix + ".driver-class-name"));
-            dsMap.put("url", env.getProperty("slave.datasource." + dsPrefix + ".url"));
-            dsMap.put("username", env.getProperty("slave.datasource." + dsPrefix + ".username"));
-            dsMap.put("password", env.getProperty("slave.datasource." + dsPrefix + ".password"));
-            DataSource ds = buildDataSource(dsMap);
-            System.out.println("MAP" + dsMap);
-            slaveDataSources.put(dsPrefix, ds);
+//        String dsPrefixs = env.getProperty("slave.datasource.names");
+//        for (String dsPrefix : dsPrefixs.split(",")) {
+//            // 多个数据源
+//            Map<String, Object> dsMap = new HashMap<>();
+//            dsMap.put("driver", env.getProperty("slave.datasource." + dsPrefix + ".driver-class-name"));
+//            dsMap.put("url", env.getProperty("slave.datasource." + dsPrefix + ".url"));
+//            dsMap.put("username", env.getProperty("slave.datasource." + dsPrefix + ".username"));
+//            dsMap.put("password", env.getProperty("slave.datasource." + dsPrefix + ".password"));
+//            DataSource ds = buildDataSource(dsMap);
+//            System.out.println("MAP" + dsMap);
+//            slaveDataSources.put(dsPrefix, ds);
+//        }
+
+        String driver = String.valueOf(dsDeMap.get("driver"));
+        String url = String.valueOf(dsDeMap.get("url"));
+        String userName = String.valueOf(dsDeMap.get("username"));
+        String passWord = String.valueOf(dsDeMap.get("password"));
+        String sql = "select id, bases_name, addrass, port, database_type, data_name, user_name, pass_word from bi_databases";
+
+        Connection conn = null;
+        PreparedStatement pstmt = null;
+        ResultSet rs = null;//定义存放查询结果的结果集
+        try {
+            Class.forName(driver);
+            conn = DriverManager.getConnection(url, userName, passWord);
+            pstmt = conn.prepareStatement(sql);
+            rs = pstmt.executeQuery();//运行查询操作
+            if(rs.next()){
+                System.out.println("rs:" + rs);
+                System.out.println("userName:" +rs.getString("user_name"));
+                // 多个数据源
+                Map<String, Object> dsMap = new HashMap<>();
+                String dei = rs.getString("database_type");
+                dsMap.put("driver", "oracle.jdbc.driver.OracleDriver");
+                dsMap.put("url", "jdbc:" + "oracle" + ":thin:@"+ rs.getString("addrass") + ":"
+                        + rs.getString("port") + ":" + rs.getString("data_name"));
+                dsMap.put("username", rs.getString("user_name"));
+                dsMap.put("password", rs.getString("pass_word"));
+                DataSource ds = buildDataSource(dsMap);
+                slaveDataSources.put(rs.getString("user_name"), ds);
+            }
+            } catch (ClassNotFoundException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (SQLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }finally {
+            try {
+                conn.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
         }
         }
     }
     }
 
 
+
     @Override
     @Override
     public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
     public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
-        Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
+
         //添加默认数据源
         //添加默认数据源
         targetDataSources.put("dataSource", this.defaultDataSource);
         targetDataSources.put("dataSource", this.defaultDataSource);
         DynamicDataSourceContextHolder.dataSourceIds.add("dataSource");
         DynamicDataSourceContextHolder.dataSourceIds.add("dataSource");

+ 30 - 30
src/main/resources/application.properties

@@ -9,36 +9,36 @@ spring.datasource.username=UAS_DEV
 spring.datasource.password=select!#%*(
 spring.datasource.password=select!#%*(
 #默认数据源
 #默认数据源
 
 
-slave.datasource.names=UAS,UAS_DEV,YITOA_DATACENTER,N_USOFTSYS
-//UAS标准版
-slave.datasource.UAS.driver-class-name=oracle.jdbc.driver.OracleDriver
-slave.datasource.UAS.url=jdbc:oracle:thin:@218.17.158.219:1521:orcl
-slave.datasource.UAS.username=UAS
-slave.datasource.UAS.password=select!#%*(
-
-//研发
-slave.datasource.UAS_DEV.driver-class-name=oracle.jdbc.driver.OracleDriver
-slave.datasource.UAS_DEV.url=jdbc:oracle:thin:@218.17.158.219:1521:orcl
-slave.datasource.UAS_DEV.username=UAS_DEV
-slave.datasource.UAS_DEV.password=select!#%*(
-
-//英唐资料中心
-slave.datasource.YITOA_DATACENTER.driver-class-name=oracle.jdbc.driver.OracleDriver
-slave.datasource.YITOA_DATACENTER.url=jdbc:oracle:thin:@10.1.1.168:1521:orcl
-slave.datasource.YITOA_DATACENTER.username=YITOA_DATACENTER
-slave.datasource.YITOA_DATACENTER.password=select!#%*(
-
-//优软科技
-slave.datasource.N_USOFTSYS.driver-class-name=oracle.jdbc.driver.OracleDriver
-slave.datasource.N_USOFTSYS.url=jdbc:oracle:thin:@10.1.1.168:1521:orcl
-slave.datasource.N_USOFTSYS.username=N_USOFTSYS
-slave.datasource.N_USOFTSYS.password=select!#%*(
-
-//
-slave.datasource.N_WILIC.driver-class-name=oracle.jdbc.driver.OracleDriver
-slave.datasource.N_WILIC.url=jdbc:oracle:thin:@218.18.115.198:1521:orcl
-slave.datasource.N_WILIC.username=N_WILIC 
-slave.datasource.N_WILIC.password=select!#%*(
+#slave.datasource.names=UAS,UAS_DEV,YITOA_DATACENTER,N_USOFTSYS
+#//UAS标准版
+#slave.datasource.UAS.driver-class-name=oracle.jdbc.driver.OracleDriver
+#slave.datasource.UAS.url=jdbc:oracle:thin:@218.17.158.219:1521:orcl
+#slave.datasource.UAS.username=UAS
+#slave.datasource.UAS.password=select!#%*(
+#
+#//研发
+#slave.datasource.UAS_DEV.driver-class-name=oracle.jdbc.driver.OracleDriver
+#slave.datasource.UAS_DEV.url=jdbc:oracle:thin:@218.17.158.219:1521:orcl
+#slave.datasource.UAS_DEV.username=UAS_DEV
+#slave.datasource.UAS_DEV.password=select!#%*(
+#
+#//英唐资料中心
+#slave.datasource.YITOA_DATACENTER.driver-class-name=oracle.jdbc.driver.OracleDriver
+#slave.datasource.YITOA_DATACENTER.url=jdbc:oracle:thin:@10.1.1.168:1521:orcl
+#slave.datasource.YITOA_DATACENTER.username=YITOA_DATACENTER
+#slave.datasource.YITOA_DATACENTER.password=select!#%*(
+#
+#//优软科技
+#slave.datasource.N_USOFTSYS.driver-class-name=oracle.jdbc.driver.OracleDriver
+#slave.datasource.N_USOFTSYS.url=jdbc:oracle:thin:@10.1.1.168:1521:orcl
+#slave.datasource.N_USOFTSYS.username=N_USOFTSYS
+#slave.datasource.N_USOFTSYS.password=select!#%*(
+#
+#//
+#slave.datasource.N_WILIC.driver-class-name=oracle.jdbc.driver.OracleDriver
+#slave.datasource.N_WILIC.url=jdbc:oracle:thin:@218.18.115.198:1521:orcl
+#slave.datasource.N_WILIC.username=N_WILIC
+#slave.datasource.N_WILIC.password=select!#%*(