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; /** * 动态数据源 * * @author ltkj */ public class DynamicDataSource extends AbstractRoutingDataSource { private final Map targetDataSources = new ConcurrentHashMap<>(); // 存储所有数据源 public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { System.out.println("当前数据源 -> "+ DynamicDataSourceContextHolder.getDataSourceType()); return DynamicDataSourceContextHolder.getDataSourceType(); } public void addTargetDataSource(String key, DataSource dataSource) { targetDataSources.put(key, dataSource); super.setTargetDataSources(new ConcurrentHashMap<>(targetDataSources)); // 更新目标数据源 super.afterPropertiesSet(); // 重新初始化数据源 } // 允许外部访问所有目标数据源 @Override public void setTargetDataSources(Map targetDataSources) { super.setTargetDataSources(targetDataSources); } public Map getTargetDataSources() { return targetDataSources; // 获取所有目标数据源 } }