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