多数据源动态切换
- 继承Spring-jbdc的
AbstractRoutingDataSource
,实现其determineCurrentLookupKey
方法来确定当前使用的数据源; - 一般主从切换针对方法级或类级,需要在执行方法或进入类之前明确当前需要的数据源,这时采用Aop的思想+注解来实现;
- 为了确保每个线程之间数据源的独立性,需要增加ThreadLocal来隔离。
1、继承AbstractRoutingDataSource
继承AbstractRoutingDataSource,实现其抽象方法determineCurrentLookupKey。
public class MSRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
//ThreadLocal记录当前线程使用的DataSource
return DataSourceHandler.getDataSource();
}
}
[外链图片转存失败(img-HP3SxgUl-1563977469384)(media/15633553276487/AbstractRoutingDataSource.png)]
AbstractRoutingDataSource实现jdk的
javax.sql.DataSource
接口,其DataSource创建Connection时会通过determineCurrentLookupKey方法来确定使用哪一个Datasource。
//1、创建数据库Connection
public Connection getConnection() throws SQLException {
return determineTargetDataSource().getConnection();
}
//2、确定使用哪一个数据源
protected DataSource determineTargetDataSource() {
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
//lookupKey从Map【resolvedDataSources】中获取对应的Datasource
Object lookupKey = determineCurrentLookupKey();
DataSource dataSource = this.resolvedDataSources.get(lookupKey);
if (dataSource == null && (this.lenientFallback || lookupKey == null)) {<