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 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); } } }