我的spring引导mvc项目通过存储库接口与数据库进行交互,该接口使用Spring默认配置很好地工作:
spring:
datasource:
url: jdbc:mysql://localhost/some_schema
username:
...
@Configuration
@EnableJpaRepositories(basePackages = {"my.path.to.repository"})
public class Application extends WebMvcConfigurerAdapter {
....现在,根据某些运行时条件,我需要在一个单独的位置与相同的第二个数据库(相同的模式)进行交互。我发现的解决方案都指向根据数据源创建单独的存储库包。
但是,由于数据库是相同的,那么是否有一种优雅的方法可以避免对每个添加的数据源重复存储库包?
发布于 2017-02-08 04:29:09
您可以通过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/
https://stackoverflow.com/questions/42102313
复制相似问题