JdbcTemplate支持数据源的动态切换,这可以实现读写分离、容灾切换等功能。
动态切换数据源的步骤如下:
- 定义多个数据源,例如:
DataSource writeDs = ...; // 写数据源
DataSource readDs1 = ...; // 读数据源1
DataSource readDs2 = ...; // 读数据源2
- 创建DynamicDataSource类,继承AbstractRoutingDataSource,并实现determineCurrentLookupKey()方法:
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
return DataSourceType.WRITE; // 返回数据源标识
}
}
- 在DynamicDataSource中设置多个数据源,并指定KEY:
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.WRITE, writeDs);
targetDataSources.put(DataSourceType.READ1, readDs1);
targetDataSources.put(DataSourceType.READ2, readDs2);
setTargetDataSources(targetDataSources);
- 设置默认数据源:
setDefaultTargetDataSource(writeDs);
- 获取JdbcTemplate,设置DynamicDataSource作为数据源:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dynamicDataSource);
- 动态切换数据源,调用:
dynamicDataSource.determineCurrentLookupKey();
并返回对应的数据源标识作为KEY,例如:DataSourceType.READ1
- JdbcTemplate的所有操作会使用当前KEY对应的数据源
所以,切换数据源的关键在于determineCurrentLookupKey()方法的返回值,它可以根据任意业务规则来返回不同的数据源标识,以实现动态切换数据源。
相比直接使用固定数据源,动态数据源的优点是:
- 可以灵活切换不同数据源
- 支持读写分离,切换读写数据源
- 支持容灾,一旦数据源不可用可以切换到其他数据源
- 增加系统的灵活性和容错性