业务背景:
我们的项目使用到了
dynamic-datasource-spring-boot-starter实现动态数据源切换功能,3.3.2版本中支持复杂的调用模式,提供一次请求中,调用的方法栈多次切换数据源。
我们的实际业务一次请求只需要切换一次数据源,所以重写了源框架获取数据源的操作。
直接上代码:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
public class MyDynamicDataSource extends DynamicRoutingDataSource {
/**
* 取得当前使用哪个数据源
*
* @return
*/
@Override
public DataSource determineDataSource() {
String dsKey = getKey();
DataSource dataSource = getDataSource(dsKey);
return dataSource;
}
private String getKey() {
//你自己租户key 获取方法 通常这里推荐使用ThreadLocal的线程变量
//保证本次调用的数据源不变
return null;
}
}
@Slf4j
@Configuration
@EnableConfigurationProperties(DynamicDataSourceProperties.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@Import(value = {DruidDynamicDataSourceConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class, DynamicDataSourceHealthCheckConfiguration.class})
@ConditionalOnProperty(prefix = DynamicDataSourceProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
public class MyDynamicDataSourceAutoConfiguration extends DynamicDataSourceAutoConfiguration {
DynamicDataSourceProperties properties;
public MyDynamicDataSourceAutoConfiguration(DynamicDataSourceProperties properties) {
super(properties);
this.properties = properties;
}
@Override
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
DynamicRoutingDataSource dataSource = new MyDynamicDataSource();
dataSource.setPrimary( properties.getPrimary());
dataSource.setStrict(properties.getStrict());
dataSource.setStrategy(properties.getStrategy());
dataSource.setProvider(dynamicDataSourceProvider);
dataSource.setP6spy(properties.getP6spy());
dataSource.setSeata(properties.getSeata());
return dataSource;
}
}