使用SmartInitializingSingleton设置动态数据源,完整代码
时间: 2024-01-09 07:03:41 浏览: 46
好的,下面是使用SmartInitializingSingleton设置动态数据源的一个示例代码:
```java
@Configuration
public class DataSourceConfig implements SmartInitializingSingleton {
private static final Logger log = LoggerFactory.getLogger(DataSourceConfig.class);
@Autowired
private DataSourceProperties dataSourceProperties;
private Map<Object, Object> targetDataSources = new HashMap<>();
@Bean
@Primary
public DataSource dataSource() {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> resolvedDataSources = new HashMap<>();
DataSource defaultDataSource = createDataSource(dataSourceProperties);
resolvedDataSources.put("dataSource", defaultDataSource);
dynamicRoutingDataSource.setDefaultTargetDataSource(defaultDataSource);
dynamicRoutingDataSource.setTargetDataSources(resolvedDataSources);
dynamicRoutingDataSource.afterPropertiesSet();
return dynamicRoutingDataSource;
}
@Override
public void afterSingletonsInstantiated() {
Map<String, DataSourceProperties> dataSourcePropertiesMap = getDataSourcePropertiesMap();
dataSourcePropertiesMap.forEach((key, value) -> {
DataSource dataSource = createDataSource(value);
targetDataSources.put(key, dataSource);
});
DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource) dataSource();
dynamicRoutingDataSource.setTargetDataSources(targetDataSources);
dynamicRoutingDataSource.afterPropertiesSet();
log.info("Dynamic DataSource Registry Successful!");
}
private Map<String, DataSourceProperties> getDataSourcePropertiesMap() {
Map<String, DataSourceProperties> map = new HashMap<>();
// 从配置文件中获取数据源配置
// 这里仅作示例,你可以根据自己的具体需要来获取数据源配置
// 这里使用了Spring Cloud Config来获取配置,你也可以使用其他方式来获取配置
List<String> names = Arrays.asList("datasource1", "datasource2");
names.forEach(name -> {
String prefix = "spring.datasource." + name;
Map<String, Object> properties = ConfigUtil.getSubProperties(environment.getPropertySources(), prefix);
DataSourceProperties dataSourceProperties = Binder.get(environment).bind(prefix, DataSourceProperties.class).get();
dataSourceProperties.setUrl(properties.get("url").toString());
dataSourceProperties.setUsername(properties.get("username").toString());
dataSourceProperties.setPassword(properties.get("password").toString());
map.put(name, dataSourceProperties);
});
return map;
}
private DataSource createDataSource(DataSourceProperties dataSourceProperties) {
HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
dataSource.setMaximumPoolSize(20);
dataSource.setMinimumIdle(5);
dataSource.setMaxLifetime(1800000);
dataSource.setIdleTimeout(600000);
dataSource.setConnectionTimeout(30000);
return dataSource;
}
}
```
在上面的代码中,我们定义了一个名为`DataSourceConfig`的配置类,并实现了`SmartInitializingSingleton`接口。在`afterSingletonsInstantiated`方法中,我们通过`getDataSourcePropertiesMap`方法获取数据源配置,然后调用`createDataSource`方法创建数据源,并将其存入`targetDataSources`中。接着,我们将`targetDataSources`设置到`DynamicRoutingDataSource`中,并调用`afterPropertiesSet`方法使其生效。最后,我们打印一条日志,表示动态数据源已成功注册。
需要注意的是,在上面的代码中,我们使用了`Spring Cloud Config`来获取数据源配置。你也可以根据自己的具体需要,使用其他方式来获取数据源配置。