From 59972ce8f9128858866c17655fc2d034d023b976 Mon Sep 17 00:00:00 2001 From: zjh <1084500556@qq.com> Date: 星期五, 07 二月 2025 17:33:15 +0800 Subject: [PATCH] zjh20250207 --- ltkj-hosp/src/main/java/com/ltkj/db/DataSourceConfig.java | 2 ltkj-hosp/src/main/java/com/ltkj/db/HospDynamicDataSource.java | 4 - ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java | 8 ++ ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/LtkjExamJcsqdServiceImpl.java | 2 ltkj-framework/src/main/java/com/ltkj/framework/datasource/DynamicDataSource.java | 21 ++++++ ltkj-framework/src/main/java/com/ltkj/framework/config/DruidConfig.java | 92 ++++++++++++++++++++++++++++-- 6 files changed, 113 insertions(+), 16 deletions(-) diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/config/DruidConfig.java b/ltkj-framework/src/main/java/com/ltkj/framework/config/DruidConfig.java index a3924ad..df79300 100644 --- a/ltkj-framework/src/main/java/com/ltkj/framework/config/DruidConfig.java +++ b/ltkj-framework/src/main/java/com/ltkj/framework/config/DruidConfig.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; -import javax.annotation.Resource; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -14,14 +13,12 @@ import javax.servlet.ServletResponse; import javax.sql.DataSource; +import com.ltkj.db.HospDynamicDataSource; import com.ltkj.framework.config.properties.DruidProperties; import com.ltkj.framework.datasource.DynamicDataSource; -import com.ltkj.system.service.ISysConfigService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -48,6 +45,28 @@ @Value ("${config.path}") private String path; + + + 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; + + private String primaryPort; + + // @Value("${spring.datasource.username}") + private String primaryUsername; + + // @Value("${spring.datasource.password}") + private String primaryPassword; + + // @Value("${dbUrl}") + private String dbUrl; + + private String dbName; @Bean @@ -259,8 +278,6 @@ return druidProperties.dataSource(dataSource); } - - @Bean // @ConfigurationProperties("spring.datasource.druid.slavepacs") // @ConditionalOnProperty(prefix = "spring.datasource.druid.slavepacs", name = "enabled", havingValue = "true") @@ -346,6 +363,69 @@ return dataSource; } +// @Bean(name = "hospDynamicDataSources") +// public DataSource hospDynamicDataSources() { +// HospDynamicDataSource dynamicDataSource = new HospDynamicDataSource(); +// FileInputStream fis = null; +// Properties props = new Properties(); +// try { +// fis = new FileInputStream(url); +// props.load(fis); +// fis.close(); +// dbUrl = props.getProperty("ip"); +// dbName = props.getProperty("name"); +// primaryPassword = props.getProperty("password"); +// primaryPort = props.getProperty("prot"); +// primaryUsername = props.getProperty("username"); +// } catch (IOException e) { +// throw new RuntimeException("璇诲彇閰嶇疆鏂囦欢澶辫触", e); +// } +// String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName; +// // 鍒濆鍖栭粯璁ゆ暟鎹簮涓轰富搴� +// dynamicDataSource.addTargetDataSource(DEFAULT_DATA_SOURCE_KEY, createDataSource(url, primaryUsername, primaryPassword)); +// +// dynamicDataSource.setDefaultTargetDataSource(dynamicDataSource.getTargetDataSources().get(DEFAULT_DATA_SOURCE_KEY)); // 璁剧疆榛樿鏁版嵁婧� +// return dynamicDataSource; +// } + + // 鏍规嵁鐢ㄦ埛 ID 鍔ㄦ�佽幏鍙栨暟鎹簮 + public void addDataSource(String dbName) { + FileInputStream fis = null; + Properties props = new Properties(); + try { + fis = new FileInputStream(url); + props.load(fis); + fis.close(); + dbUrl = props.getProperty("ip"); + primaryPassword = props.getProperty("password"); + primaryPort = props.getProperty("prot"); + primaryUsername = props.getProperty("username"); + } catch (IOException e) { + throw new RuntimeException("璇诲彇閰嶇疆鏂囦欢澶辫触", e); + } + + // 妫�鏌ョ紦瀛樹腑鏄惁宸茬粡瀛樺湪璇ユ暟鎹簮 + if (!dataSourceCache.containsKey(dbName)) { + synchronized (this) { + String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName; + DataSource dataSource = createDataSource(url, primaryUsername, primaryPassword); + dataSourceCache.put(dbName, dataSource); + + DynamicDataSource dynamicDataSource = dataSource(dataSource); + dynamicDataSource.addTargetDataSource(dbName, dataSource); + } + } + } + + // 鍔ㄦ�佸垱寤烘暟鎹簮 + private DataSource createDataSource(String url, String username, String password) { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + return dataSource; + } + @Bean(name = "dynamicDataSource") @Primary diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/datasource/DynamicDataSource.java b/ltkj-framework/src/main/java/com/ltkj/framework/datasource/DynamicDataSource.java index b82b6dc..d3e53c1 100644 --- a/ltkj-framework/src/main/java/com/ltkj/framework/datasource/DynamicDataSource.java +++ b/ltkj-framework/src/main/java/com/ltkj/framework/datasource/DynamicDataSource.java @@ -1,6 +1,7 @@ package com.ltkj.framework.datasource; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import javax.sql.DataSource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; @@ -11,6 +12,7 @@ * @author ltkj */ public class DynamicDataSource extends AbstractRoutingDataSource { + private final Map<Object, Object> targetDataSources = new ConcurrentHashMap<>(); // 瀛樺偍鎵�鏈夋暟鎹簮 public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); @@ -19,6 +21,23 @@ @Override protected Object determineCurrentLookupKey() { + System.out.println("褰撳墠鏁版嵁婧� -> "+ DynamicDataSourceContextHolder.getDataSourceType()); return DynamicDataSourceContextHolder.getDataSourceType(); } -} \ No newline at end of file + + public void addTargetDataSource(String key, DataSource dataSource) { + 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; // 鑾峰彇鎵�鏈夌洰鏍囨暟鎹簮 + } +} diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java b/ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java index ee96596..a049f69 100644 --- a/ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java +++ b/ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java @@ -6,6 +6,7 @@ import com.google.gson.Gson; import com.ltkj.db.DataSourceConfig; import com.ltkj.db.DataSourceContextHolder; +import com.ltkj.framework.config.DruidConfig; import com.ltkj.hosp.domain.DictHosp; import com.ltkj.hosp.service.IDictHospService; import org.springframework.beans.factory.annotation.Autowired; @@ -28,8 +29,10 @@ @Autowired private IDictHospService dictHospService; +// @Autowired +// private DataSourceConfig dataSourceConfig; @Autowired - private DataSourceConfig dataSourceConfig; + private DruidConfig druidConfig; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { @@ -52,7 +55,8 @@ response.getWriter().write("{\"message\":\"401锛氭壘涓嶅埌闄㈠尯鏁版嵁\"}"); return false; } - dataSourceConfig.addDataSource(hosp.getDbname()); +// dataSourceConfig.addDataSource(hosp.getDbname()); + druidConfig.addDataSource(hosp.getDbname()); DataSourceContextHolder.setDataSourceKey(hosp.getDbname()); } catch (IOException e) { return false; diff --git a/ltkj-hosp/src/main/java/com/ltkj/db/DataSourceConfig.java b/ltkj-hosp/src/main/java/com/ltkj/db/DataSourceConfig.java index f57d7d6..8d5d828 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/db/DataSourceConfig.java +++ b/ltkj-hosp/src/main/java/com/ltkj/db/DataSourceConfig.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Properties; -@Configuration +//@Configuration public class DataSourceConfig { private static final String DEFAULT_DATA_SOURCE_KEY = "default"; // 涓诲簱鐨勬爣璇� diff --git a/ltkj-hosp/src/main/java/com/ltkj/db/HospDynamicDataSource.java b/ltkj-hosp/src/main/java/com/ltkj/db/HospDynamicDataSource.java index 1cd8baa..06267f4 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/db/HospDynamicDataSource.java +++ b/ltkj-hosp/src/main/java/com/ltkj/db/HospDynamicDataSource.java @@ -1,11 +1,7 @@ package com.ltkj.db; -import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; -import org.springframework.stereotype.Component; - import javax.sql.DataSource; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/LtkjExamJcsqdServiceImpl.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/LtkjExamJcsqdServiceImpl.java index 6182d21..9ad309e 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/LtkjExamJcsqdServiceImpl.java +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/LtkjExamJcsqdServiceImpl.java @@ -37,8 +37,6 @@ private LtkjExamJcsqdMapper mapper; @Qualifier(value = "slaveHisDataSource") - @Autowired - private DataSource dataSource; @Override -- Gitblit v1.8.0