DataSourceManager 动态数据源 代码
时间: 2024-05-01 09:22:05 浏览: 11
以下是一个简单的 DataSourceManager 动态数据源的代码示例:
```java
public class DataSourceManager {
private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
dataSourceKey.set(key);
}
public static String getDataSourceKey() {
return dataSourceKey.get();
}
public static void clearDataSourceKey() {
dataSourceKey.remove();
}
}
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceManager.getDataSourceKey();
}
}
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public DynamicDataSource dynamicDataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource());
targetDataSources.put("slave", slaveDataSource());
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(masterDataSource());
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dynamicDataSource());
}
}
```
在上面的代码中,`DataSourceManager` 类使用 `ThreadLocal` 存储当前线程的数据源 key,`DynamicDataSource` 继承 `AbstractRoutingDataSource` 并实现了 `determineCurrentLookupKey()` 方法,该方法根据当前线程的数据源 key 返回对应的数据源。`DataSourceConfig` 类定义了两个数据源(master 和 slave)以及一个动态数据源(dynamicDataSource),并将动态数据源作为事务管理器的数据源。在需要切换数据源的地方,只需要调用 `DataSourceManager.setDataSourceKey(key)` 方法设置当前线程的数据源 key 即可。