在我的spring应用程序中,我需要根据应用程序配置中设置的某些值动态初始化多个数据源。 我知道spring jdbc库提供的AbstractRoutingDataSource类,但它只在你需要一次基于单个查找键值初始化单个数据源时才有用。
是否可以扩展AbstractRoutingDataSource并更改其行为以支持多键查找和数据源解析?还有其他替代方法吗? Reference
基本上我试图通过AbstractDataSourceRouter类实现类似的东西:
public class DataSourceRouter extends AbstractRoutingDataSource {
@Value("${com.listdb.datasource.switch}")
private short listDBSwitch;
@Value("${com.scoringdb.datasource.switch}")
private short scoringDbSwitch;
@Value("${com.configmaster.datasource.switch}")
private short configDbSwitch;
private List<String> configuredDataSources;
/**
* Determine the current lookup key. This will typically be
* implemented to check a thread-bound transaction context.
* <p>Allows for arbitrary keys. The returned key needs
* to match the stored lookup key type, as resolved by the
* {@link #resolveSpecifiedLookupKey} method.
*/
@Override
protected Object determineCurrentLookupKey() {
if(ListUtil.isListNotEmpty(configuredDataSources)) {
configuredDataSources =new ArrayList<String>();
String listDBString = (listDBSwitch == 1)?DataSources.LIST.toString() : null;
String configDBString = (configDbSwitch == 1) ? DataSources.CONFIGMASTER.toString() :null;
String scoringDBString = (scoringDbSwitch == 1) ? DataSources.SCORING.toString() : null;
/**
* Add all configured data source keys for look up
*/
configuredDataSources.add(listDBString);
configuredDataSources.add(configDBString);
configuredDataSources.add(scoringDBString);
}
return configuredDataSources;
}
}
任何帮助/建议?
答案 0 :(得分:0)
对于当前的spring / hibernate版本来说,这是不可能的,即使这样做也很简洁。如果您需要多个数据源并使用AbstractRoutingDataSource来实现这一点,那么一种可能的解决方案是让spring初始化一个DB(默认/配置DB)并添加例如init.sql脚本(或者如果你更喜欢它的flyway / liquibase),它在同一个AbstractRoutingDataSource下初始化所有其他脚本。
这种方法运行良好,让您可以更好地控制您的(希望测试!)环境。我个人喜欢对DB模式有更多的控制权,然后任何自动初始化程序都可以提供,但这只是一个品味/风格问题。