spring boot dynamic 动态数据数据源配置连接池
在Spring Boot中配置动态数据源,通常需要实现AbstractRoutingDataSource
来根据某种键(如当前用户的标识)动态路由到不同的数据源。以下是一个简化的例子:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class DynamicDataSource extends AbstractRoutingDataSource {
private final Map<Object, Object> dynamicTargetDataSources = new ConcurrentHashMap<>();
@Override
protected Object determineCurrentLookupKey() {
// 从ThreadLocal中获取数据源标识
return DataSourceContextHolder.getDataSourceType();
}
public void addDataSource(Object key, DataSource dataSource) {
this.dynamicTargetDataSources.put(key, dataSource);
this.setTargetDataSources(dynamicTargetDataSources);
// 在添加数据源后,需要调用afterPropertiesSet()方法来更新内部的数据源映射
this.afterPropertiesSet();
}
public void removeDataSource(Object key) {
this.dynamicTargetDataSources.remove(key);
this.setTargetDataSources(dynamicTargetDataSources);
// 在移除数据源后,需要调用afterPropertiesSet()方法来更新内部的数据源映射
this.afterPropertiesSet();
}
}
// 使用ThreadLocal保存当前数据源标识
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
public static String getDataSourceType() {
return contextHolder.get();
}
public static void clearDataSourceType() {
contextHolder.remove();
}
}
// 在配置类中配置DynamicDataSource bean
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 配置默认数据源
dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());
// 配置动态数据源
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("primary", primaryDataSource());
// 可以根据实际情况动态添加其他数据源
// dynamicDataSource
评论已关闭