package com.ltkj.common.db; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; //@Configuration public class DataSourceConfig { // 使用代码 // try { // long id = Long.parseLong(request.getAttribute("id").toString()); // DataSourceContextHolder.setDataSourceKey(String.valueOf(id)); // dataSourceConfig.addDataSource(String.valueOf(id)); // 确保数据源已注册 // if (log.getSize()>50) log.setSize(50); // if (log.getLang().equals("zh-cn")) log.setLang("zh"); // return serverLogService.getLog(log,id); // }finally { // DataSourceContextHolder.setDataSourceKey("default"); // 切换回主库 // } 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); } } }