spring bootにてDB分割する要件があったので備忘録。
1. AbstractRoutingDataSource#determineCurrentLookupKeyをoverride 後に定義するdatasourceのmapのkey名を返却する処理を記述。 ex.
public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return SchemaContextHolder.getSchemaType(); } }
2. datasourceのbeanを作成。
1.で作成したクラスにdatasourceのmapを設定。
ex.
@Configuration
public class DatasourceConfig {
@Bean
public DataSource dataSource() {
DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver();
Map<Object, Object> dataSources = new HashMap<Object,Object>();
dataSources.put("datasource1", datasource1());
dataSources.put("datasource2", datasource2());
resolver.setTargetDataSources(dataSources);
resolver.setDefaultTargetDataSource(datasource1());
return resolver;
}
...
}
3. repositoryを呼ぶ前にSchemaContextHolder.getSchemaTypeにdatasourceのkey名をが戻り値になる値を返却。スレッドセーフとするためにThreadLocalを使用すること。