From f89a6c6acd475d84dd069df828d40ce27446e0fa Mon Sep 17 00:00:00 2001 From: zhaowenxuan <chacca165@163.com> Date: 星期一, 04 八月 2025 14:48:38 +0800 Subject: [PATCH] 切库类 --- src/main/java/com/example/config/db/DataSourceConfig.java | 141 +++++++++++++++++++++++++++++++++++ src/main/java/com/example/config/db/DataSourceContextHolder.java | 17 ++++ src/main/java/com/example/config/db/HospDynamicDataSource.java | 36 +++++++++ 3 files changed, 194 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; + } + +} diff --git a/src/main/java/com/example/config/db/DataSourceContextHolder.java b/src/main/java/com/example/config/db/DataSourceContextHolder.java new file mode 100644 index 0000000..48b9563 --- /dev/null +++ b/src/main/java/com/example/config/db/DataSourceContextHolder.java @@ -0,0 +1,17 @@ +package com.example.config.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/src/main/java/com/example/config/db/HospDynamicDataSource.java b/src/main/java/com/example/config/db/HospDynamicDataSource.java new file mode 100644 index 0000000..00b7b78 --- /dev/null +++ b/src/main/java/com/example/config/db/HospDynamicDataSource.java @@ -0,0 +1,36 @@ +package com.example.config.db; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import javax.sql.DataSource; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +public class HospDynamicDataSource extends AbstractRoutingDataSource { + + private final Map<Object, Object> targetDataSources = new ConcurrentHashMap<>(); + + @Override + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDataSourceKey(); + } + + public void addTargetDataSource(String key, DataSource dataSource) { + if (dataSource != null) { + targetDataSources.put(key, dataSource); + super.setTargetDataSources(new ConcurrentHashMap<>(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