.
org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator
/**
* org.apache.shardingsphere.masterslave.route.engine.MasterSlaveRouteDecorator
*/
public final class MasterSlaveRouteDecorator implements RouteDecorator<MasterSlaveRule> {
@Override
public RouteContext decorate(final RouteContext routeContext, final ShardingSphereMetaData metaData, final MasterSlaveRule masterSlaveRule, final ConfigurationProperties properties) {
if (routeContext.getRouteResult().getRouteUnits().isEmpty()) {
String dataSourceName = new MasterSlaveDataSourceRouter(masterSlaveRule).route(routeContext.getSqlStatementContext().getSqlStatement());
RouteResult routeResult = new RouteResult();
routeResult.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName, dataSourceName), Collections.emptyList()));
return new RouteContext(routeContext.getSqlStatementContext(), Collections.emptyList(), routeResult);
}
Collection<RouteUnit> toBeRemoved = new LinkedList<>();
Collection<RouteUnit> toBeAdded = new LinkedList<>();
/**
* <pre>
* RouteResult : {
* routeUnits : [
* RouteUnit : {
* dataSourceMapper : RouteMapper {logicName : "dataSource00", actualName : "dataSource00"},
* tableMappers : [
* RouteMapper : {logicName : "tb_users", actualName : "tb_users_00"}
* ]
* },
* RouteUnit : {
* dataSourceMapper : RouteMapper {logicName : "dataSource00", actualName : "dataSource00"},
* tableMappers : [
* RouteMapper : {logicName : "tb_users", actualName : "tb_users_01"}
* ]
* },
* RouteUnit : {
* dataSourceMapper : RouteMapper {logicName : "dataSource01", actualName : "dataSource00"},
* tableMappers : [
* RouteMapper : {logicName : "tb_users", actualName : "tb_users_00"}
* ]
* },
* RouteUnit : {
* dataSourceMapper : RouteMapper {logicName : "dataSource01", actualName : "dataSource00"},
* tableMappers : [
* RouteMapper : {logicName : "tb_users", actualName : "tb_users_01"}
* ]
* }
* ]
*
* }
* </pre>
*/
for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
if (masterSlaveRule.getName().equalsIgnoreCase(each.getDataSourceMapper().getActualName())) {
// 删除原数据
toBeRemoved.add(each);
/**
* <pre>
* 1、调用《注册数据源路由器》
* 1、检查是否要执行走主库逻辑(非select、sql语句存在锁标记、强制标记走主库、是否有hint标记)
* 2、创建负载均衡器,选择一个从库
* </pre>
*/
String actualDataSourceName = new MasterSlaveDataSourceRouter(masterSlaveRule).route(routeContext.getSqlStatementContext().getSqlStatement());
// 增加新的数据
toBeAdded.add(new RouteUnit(new RouteMapper(each.getDataSourceMapper().getLogicName(), actualDataSourceName), each.getTableMappers()));
}
}
routeContext.getRouteResult().getRouteUnits().removeAll(toBeRemoved);
routeContext.getRouteResult().getRouteUnits().addAll(toBeAdded);
return routeContext;
}
@Override
public int getOrder() {
return 10;
}
@Override
public Class<MasterSlaveRule> getType() {
return MasterSlaveRule.class;
}
}
.