sharding sphere 4.1.1 - “路由装饰器RouteDecorator-主从”

.

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;
    }
}

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值