From 1e3a838de89a277b2bc65761c0e5619a96a64813 Mon Sep 17 00:00:00 2001
From: zhaowenxuan <chacca165@163.com>
Date: 星期五, 07 二月 2025 09:02:46 +0800
Subject: [PATCH] 20250207

---
 ltkj-admin/src/main/java/com/ltkj/web/db/DynamicDataSource.java       |   34 +++++++++++++++++
 ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceContextHolder.java |   17 ++++++++
 ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceConfig.java        |   63 +++++++++++++++++++++++++++++++
 3 files changed, 114 insertions(+), 0 deletions(-)

diff --git a/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceConfig.java b/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceConfig.java
new file mode 100644
index 0000000..ebed200
--- /dev/null
+++ b/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceConfig.java
@@ -0,0 +1,63 @@
+package com.ltkj.web.db;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DataSourceConfig {
+
+    private static final String DEFAULT_DATA_SOURCE_KEY = "default"; // 涓诲簱鐨勬爣璇�
+    private final Map<String, DataSource> dataSourceCache = new HashMap<>(); // 鏁版嵁婧愮紦瀛�
+
+    // 浠� application.yml 涓鍙栦富搴撶殑閰嶇疆
+    @Value("${spring.datasource.url}")
+    private String primaryUrl;
+
+    @Value("${spring.datasource.username}")
+    private String primaryUsername;
+
+    @Value("${spring.datasource.password}")
+    private String primaryPassword;
+
+    @Value("${dbUrl}")
+    private String dbUrl;
+
+    @Bean
+    public DataSource dynamicDataSource() {
+        DynamicDataSource dynamicDataSource = new DynamicDataSource();
+
+        // 鍒濆鍖栭粯璁ゆ暟鎹簮涓轰富搴�
+        dynamicDataSource.addTargetDataSource(DEFAULT_DATA_SOURCE_KEY, createDataSource(primaryUrl, primaryUsername, primaryPassword));
+
+        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 userId) {
+        String dbName = "scum_admin_user_" + userId;
+        // 妫�鏌ョ紦瀛樹腑鏄惁宸茬粡瀛樺湪璇ユ暟鎹簮
+        if (!dataSourceCache.containsKey(userId)) {
+            String url = "jdbc:mysql://"+dbUrl+":3306/"+dbName;
+            DataSource dataSource = createDataSource(url, primaryUsername, primaryPassword);
+            dataSourceCache.put(userId, dataSource);
+            DynamicDataSource dynamicDataSource = (DynamicDataSource) dynamicDataSource();
+            dynamicDataSource.addTargetDataSource(userId, dataSource);
+        }
+    }
+}
diff --git a/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceContextHolder.java b/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceContextHolder.java
new file mode 100644
index 0000000..961274f
--- /dev/null
+++ b/ltkj-admin/src/main/java/com/ltkj/web/db/DataSourceContextHolder.java
@@ -0,0 +1,17 @@
+package com.ltkj.web.db;
+
+public class DataSourceContextHolder {
+    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
+
+    public static void setDataSourceKey(String key) {
+        contextHolder.set(key);
+    }
+
+    public static String getDataSourceKey() {
+        return contextHolder.get();
+    }
+
+    public static void clear() {
+        contextHolder.remove();
+    }
+}
diff --git a/ltkj-admin/src/main/java/com/ltkj/web/db/DynamicDataSource.java b/ltkj-admin/src/main/java/com/ltkj/web/db/DynamicDataSource.java
new file mode 100644
index 0000000..782cf9d
--- /dev/null
+++ b/ltkj-admin/src/main/java/com/ltkj/web/db/DynamicDataSource.java
@@ -0,0 +1,34 @@
+package com.ltkj.web.db;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DynamicDataSource extends AbstractRoutingDataSource {
+
+    private final Map<Object, Object> targetDataSources = new HashMap<>(); // 瀛樺偍鎵�鏈夋暟鎹簮
+
+    @Override
+    protected Object determineCurrentLookupKey() {
+        return DataSourceContextHolder.getDataSourceKey(); // 鏍规嵁涓婁笅鏂囪幏鍙栧綋鍓嶆暟鎹簮鐨勯敭
+    }
+
+    // 娣诲姞鐩爣鏁版嵁婧�
+    public void addTargetDataSource(String key, DataSource dataSource) {
+        targetDataSources.put(key, dataSource);
+        super.setTargetDataSources(targetDataSources); // 鏇存柊鐩爣鏁版嵁婧�
+        super.afterPropertiesSet(); // 閲嶆柊鍒濆鍖栨暟鎹簮
+    }
+
+    // 鍏佽澶栭儴璁块棶鎵�鏈夌洰鏍囨暟鎹簮
+    @Override
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        super.setTargetDataSources(targetDataSources);
+    }
+
+    public Map<Object, Object> getTargetDataSources() {
+        return targetDataSources; // 鑾峰彇鎵�鏈夌洰鏍囨暟鎹簮
+    }
+}

--
Gitblit v1.8.0