我的spring boot mvc项目通过存储库接口与数据库交互,使用Spring启动默认配置很好地工作:
spring:
datasource:
url: jdbc:mysql://localhost/some_schema
username:
...
@Configuration
@EnableJpaRepositories(basePackages = {"my.path.to.repository"})
public class Application extends WebMvcConfigurerAdapter {
....
现在,根据某些运行时条件,我需要在一个单独的位置与相同的第二个数据库(相同的模式)进行交互。我发现的解决方案都指向为每个数据源创建一个单独的存储库包。
由于数据库完全相同,是否有一种优雅的方法可以避免为每个添加的数据源重复存储库包?
答案 0 :(得分:0)
您可以使用Spring AbstractRoutingDataSource完成此操作。
大致是:
public class ChooseOneDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
if (***some runtime condition***) {
return "dataSource1";
} else {
return "dataSource2";
}
}
}
在你的会议中:
@Bean
@ConfigurationProperties(prefix = "dataSource1")
DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "dataSource2")
DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
@Bean
DataSource dataSource() {
AbstractRoutingDataSource dataSource = new ChooseOneDataSource();
Map<Object,Object> resolvedDataSources = new HashMap<>();
resolvedDataSource.put("dataSource1", dataSource1());
resolvedDataSource.put("dataSource2", dataSource2());
dataSource.setDefaultTargetDataSource(dataSource1()); // << default
dataSource.setTargetDataSources(resolvedDataSources);
return dataSource;
}
更多信息/示例:
http://fizzylogic.nl/2016/01/24/Make-your-Spring-boot-application-multi-tenant-aware-in-2-steps/ https://spring.io/blog/2007/01/23/dynamic-datasource-routing/