SpringBoot整合多数据源,并支持动态新增与切换(详细教程)
在Spring Boot中整合多数据源并支持动态新增数据源以及数据源切换的完整示例代码如下:
@Configuration
public class DynamicDataSourceConfig {
@Bean
public DataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 默认数据源
dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());
// 配置多数据源
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("primary", primaryDataSource());
dataSourceMap.put("secondary", secondaryDataSource());
// 设置数据源Map
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
@Bean
@Primary
public DataSource primaryDataSource() {
// 创建数据源配置
return DataSourceBuilder.create().build();
}
@Bean
public DataSource secondaryDataSource() {
// 创建数据源配置
return DataSourceBuilder.create().build();
}
// 动态数据源配置类
public static class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 从ThreadLocal中获取当前数据源标识
return DynamicDataSourceContextHolder.getDataSourceType();
}
}
// 动态数据源上下文持有者
public static class DynamicDataSourceContextHolder {
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
类,它继承自AbstractRoutingDataSource
并重写了determineCurrentLookupKey
方法,以便在执行数据库操作时根据当前线程的数据源标识来选择正确的数据源。DynamicDataSourceContextHolder
类提供了方法来设置和获取当前线程的数据源标识。
使用时,你可以在执行数据库操作之前通过DynamicDataSourceContextHolder.setDataSourceType("数据源标识")
来切换数据源,完成操作后记得清除数据源标识,以防影响后续操作。
@Service
public class DataSourceService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> selectFromPrimary() {
DynamicDataSourceContextHolder.setDataSourceType("
评论已关闭