SpringBoot从数据库读取数据数据源配置信息,动态切换数据源
在Spring Boot中配置数据源并动态切换数据源,你可以使用AbstractRoutingDataSource来实现。以下是一个简化的例子:
- 配置数据源:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource routingDataSource(@Qualifier("dataSource1") DataSource dataSource1,
@Qualifier("dataSource2") DataSource dataSource2) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("dataSource1", dataSource1);
targetDataSources.put("dataSource2", dataSource2);
RoutingDataSource routingDataSource = new RoutingDataSource();
routingDataSource.setDefaultTargetDataSource(dataSource1); // 默认数据源
routingDataSource.setTargetDataSources(targetDataSources);
return routingDataSource;
}
// 其他数据源配置
// ...
}
- 创建RoutingDataSource:
public class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 从ThreadLocal中获取当前数据源标识
return DataSourceContextHolder.getDataSourceType();
}
}
- 使用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();
}
}
- 切换数据源:
public class DataSourceSwitcher {
public void switchToDataSource1() {
DataSourceContextHolder.setDataSourceType("dataSource1");
}
public void switchToDataSource2() {
DataSourceContextHolder.setDataSourceType("dataSource2");
}
}
使用时,在需要切换数据源的地方,调用switchToDataSource1()
或switchToDataSource2()
方法,之后的数据库操作将使用指定的数据源。记得在操作完成后清除ThreadLocal存储的数据源标识,以免影响后续操作。
评论已关闭