package com.ltkj.db; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Autowired; 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.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; @Configuration public class DataSourceConfig { private static final String DEFAULT_DATA_SOURCE_KEY = "default"; // 主库的标识 private final Map dataSourceCache = new HashMap<>(); // 数据源缓存 @Value("${config.properties}") private String url; @Value("${config.path}") private String path; // 从 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; @Bean(name = "hospDynamicDataSources") public DataSource hospDynamicDataSources() { HospDynamicDataSource dynamicDataSource = new HospDynamicDataSource(); // 初始化默认数据源为主库 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 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); HospDynamicDataSource dynamicDataSource = (HospDynamicDataSource) hospDynamicDataSources(); dynamicDataSource.addTargetDataSource(dbName, dataSource); } } } }