springboot 实现 动态数据源
在Spring Boot中实现动态数据源,通常需要以下步骤:
- 创建一个动态数据源类,比如
DynamicDataSource
,继承AbstractRoutingDataSource
。 - 实现
determineCurrentLookupKey
方法,该方法用于确定当前应该使用哪个数据源。 - 配置默认数据源和动态数据源。
- 提供一个方法来添加或更改数据源。
以下是一个简单的示例:
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(String key, DataSource dataSource) {
this.dynamicTargetDataSources.put(key, dataSource);
this.setTargetDataSources(dynamicTargetDataSources);
// 在添加数据源后,需要调用afterPropertiesSet()方法来更新内部的数据源映射
this.afterPropertiesSet();
}
}
import org.springframework.stereotype.Component;
@Component
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();
}
}
在配置数据源时,需要设置动态数据源为默认数据源,并配置至少一个静态数据源:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DataSourceConfig {
@Bean
@Primary
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 配置默认数据源
dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());
// 配置动态数据源
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("primary", primaryDataSource());
// 可以根据实际情况添加更多数据源
// dataSourceMap.put("seco
评论已关闭