From 093362ca4f902996aeb3586b45ebd2791a2b596f Mon Sep 17 00:00:00 2001
From: zhaowenxuan <chacca165@163.com>
Date: 星期一, 04 八月 2025 15:40:47 +0800
Subject: [PATCH] 20250804

---
 src/main/java/com/example/config/db/DataSourceConfig.java |  141 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/example/config/db/DataSourceConfig.java b/src/main/java/com/example/config/db/DataSourceConfig.java
new file mode 100644
index 0000000..3ea24d4
--- /dev/null
+++ b/src/main/java/com/example/config/db/DataSourceConfig.java
@@ -0,0 +1,141 @@
+package com.example.config.db;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.example.config.ConfigValue;
+import com.example.config.DruidProperties;
+import com.example.enums.DataSourceType;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import javax.sql.DataSource;
+
+@Slf4j
+@Configuration
+public class DataSourceConfig {
+
+    private static final String DEFAULT_DATA_SOURCE_KEY = "default"; // 涓诲簱鐨勬爣璇�
+    private final Map<String, DataSource> dataSourceCache = new HashMap<>(); // 鏁版嵁婧愮紦瀛�
+
+    @Autowired
+    private ConfigValue configValue;
+    private String primaryUrl;
+    private String primaryPort;
+    private String primaryUsername;
+    private String primaryPassword;
+    private String dbUrl;
+    private String dbName;
+    @Autowired
+    private DruidProperties druidProperties;
+
+    @Bean(name = "hospDynamicDataSources")
+    public DataSource hospDynamicDataSources() {
+        HospDynamicDataSource dynamicDataSource = new HospDynamicDataSource();
+        Map<String, String> configMap = configValue.getConfigMap();
+        dbUrl = configMap.get("ip");
+        dbName = configMap.get("name");
+        primaryPassword = configMap.get("password");
+        primaryPort = configMap.get("prot");
+        primaryUsername = configMap.get("username");
+        String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName;
+        dynamicDataSource.addTargetDataSource(DEFAULT_DATA_SOURCE_KEY, createDataSource(url, primaryUsername, primaryPassword));
+
+        DataSource masterDataSource = masterDataSource(druidProperties);
+        dynamicDataSource.addTargetDataSource(DataSourceType.MASTER.name(),masterDataSource);
+        dataSourceCache.put(DataSourceType.MASTER.name(), masterDataSource);
+
+        dynamicDataSource.setDefaultTargetDataSource(dynamicDataSource.getTargetDataSources().get(DEFAULT_DATA_SOURCE_KEY)); // 璁剧疆榛樿鏁版嵁婧�
+        return dynamicDataSource;
+    }
+
+    // 鍔ㄦ�佸垱寤烘暟鎹簮
+    private DataSource createDataSource(String url, String username, String password) {
+        DruidDataSource dataSource = new DruidDataSource();
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+        return dataSource;
+    }
+
+    // 鏍规嵁鐢ㄦ埛 ID 鍔ㄦ�佽幏鍙栨暟鎹簮
+    public void addDataSource(String dbName) {
+        Map<String, String> configMap = configValue.getConfigMap();
+        dbUrl = configMap.get("ip");
+        primaryPassword = configMap.get("password");
+        primaryPort = configMap.get("prot");
+        primaryUsername = configMap.get("username");
+        // 妫�鏌ョ紦瀛樹腑鏄惁宸茬粡瀛樺湪璇ユ暟鎹簮
+        if (!dataSourceCache.containsKey(dbName)) {
+            synchronized (this) {
+                String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName;
+                DataSource dataSource = createDataSource(url, primaryUsername, primaryPassword);
+                dataSourceCache.put(dbName, dataSource);
+                HospDynamicDataSource dynamicDataSource = (HospDynamicDataSource) hospDynamicDataSources();
+                dynamicDataSource.addTargetDataSource(dbName, dataSource);
+            }
+        }
+    }
+
+    public DataSource masterDataSource(DruidProperties druidProperties){
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        Map<String, String> configMap = configValue.getConfigMap();
+        try {
+            // 鑾峰彇灞炴�у�煎苟璧嬪��
+            Properties properties = new Properties();
+            // 杩欓噷鏄祴璇曞啓娉曪紝鍏蜂綋鐨剉alue鍙互閫氳繃璇锋眰鍙傛暟浼犻�掕繃鏉�
+            properties.setProperty("druid.url","jdbc:mysql://"+configMap.get("ip")+":"+configMap.get("prot")+"/"+configMap.get("name")+"" +
+                    "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true");
+            properties.setProperty("druid.username",configMap.get("username"));
+            properties.setProperty("druid.password",configMap.get("password"));
+            dataSource.restart(properties);
+            log.info("鏁版嵁搴撹繛鎺ユ垚鍔�!!!");
+        } catch (Exception e) {
+            log.error("鏁版嵁搴撹繛鎺ュけ璐�  璇疯仈绯荤鐞嗗憳锛�",e);
+        }
+        return druidProperties.dataSource(dataSource);
+    }
+
+    private DruidDataSource creatSqlServer(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        Properties properties = new Properties();
+        properties.setProperty("druid.enabled", enabled);
+        properties.setProperty("druid.driverClassName","com.microsoft.sqlserver.jdbc.SQLServerDriver");
+        properties.setProperty("druid.url","jdbc:sqlserver://"+ ip+":"+ port+";DatabaseName="+ db+
+                ";&characterEncoding=utf8");
+        properties.setProperty("druid.username", user);
+        properties.setProperty("druid.password", password);
+        dataSource.restart(properties);
+        return dataSource;
+    }
+
+    private DruidDataSource creatMysql(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        Properties properties = new Properties();
+        properties.setProperty("druid.enabled",enabled);
+        properties.setProperty("druid.url","jdbc:mysql://"+ip+":"+port+"/"+db+"" +
+                "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8");
+        properties.setProperty("druid.username",user);
+        properties.setProperty("druid.password",password);
+        dataSource.restart(properties);
+        return dataSource;
+    }
+
+    private DruidDataSource creatOracle(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        Properties properties = new Properties();
+        properties.setProperty("druid.enabled",enabled);
+        properties.setProperty("druid.driverClassName","oracle.jdbc.OracleDriver");
+        properties.setProperty("druid.url","jdbc:oracle:thin:@//"+ip+"/"+db);
+        properties.setProperty("druid.username",user);
+        properties.setProperty("druid.password",password);
+        dataSource.restart(properties);
+        return dataSource;
+    }
+
+}

--
Gitblit v1.8.0