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