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を使用すること。