package com.taobao.tddl.rule; import java.util.List; import com.taobao.tddl.common.model.lifecycle.Lifecycle; import com.taobao.tddl.rule.exceptions.RouteCompareDiffException; import com.taobao.tddl.rule.model.MatcherResult; import com.taobao.tddl.rule.model.sqljep.ComparativeMapChoicer; /** * 基于tddl管理体系的table rule实现 * * @author jianghang 2013-11-5 上午11:04:35 * @since 5.0.0 */ public interface TddlTableRule extends Lifecycle { /** * 根据当前规则,计算table rule结果. <br/> * ps. 当前规则可能为local本地规则或者是当前使用中的远程规则 * * @param vtab 逻辑表名 * @param choicer 参数提取,比如statement sql中自带的参数 * @param args 通过prepareStatement设置的参数 * @return */ public MatcherResult route(String vtab, ComparativeMapChoicer choicer, List<Object> args); /** * 指定version规则版本,计算table rule结果 * * @param vtab 逻辑表名 * @param choicer 参数提取,比如statement sql中自带的参数 * @param args 通过prepareStatement设置的参数 * @param specifyVtr 指定规则 * @return */ public MatcherResult route(String vtab, ComparativeMapChoicer choicer, List<Object> args, String version); /** * 指定规则,计算table rule结果 * * @param vtab 逻辑表名 * @param choicer 参数提取,比如statement sql中自带的参数 * @param args 通过prepareStatement设置的参数 * @param specifyVtr 指定规则 * @return */ public MatcherResult route(String vtab, ComparativeMapChoicer choicer, List<Object> args, VirtualTableRoot specifyVtr); /** * 根据当前规则,同时支持新旧规则模式的计算 <br/> * ps. 运行时切库会同时指定新旧两个版本号,针对读请求使用老规则,针对写请求如果新老规则相同则正常返回,如果不同则抛diff异常.<br/> * * <pre> * 一般切换步骤: * 1. 根据新规则,将老库数据做一次数据复制 * 2. 线上配置新老规则,同时生效 * 3. 应用前端停写,等待后端增量数据迁移完全追平 * 4. 线上配置为新规则 * 5. 删除老库上的数据 * </pre> * * @param sqlType 原始sql类型 * @param vtab 逻辑表名 * @param choicer 参数提取,比如statement sql中自带的参数 * @param args 通过prepareStatement设置的参数 * @return * @throws RouteCompareDiffException */ public MatcherResult routeMverAndCompare(boolean isSelect, String vtab, ComparativeMapChoicer choicer, List<Object> args) throws RouteCompareDiffException; // ==================== 以下方法可支持非jdbc协议使用rule ================= /** * 根据当前规则,计算table rule结果. <br/> * * @param vtab 逻辑表 * @param condition 类似statement sql表达式 * @return */ public MatcherResult route(String vtab, String condition); /** * 指定规则,计算table rule结果. <br/> * * @param vtab 逻辑表 * @param condition 类似statement sql表达式 * @return */ public MatcherResult route(String vtab, String condition, VirtualTableRoot specifyVtr); /** * 指定version规则版本,计算table rule结果. <br/> * * @param vtab 逻辑表 * @param condition 类似statement sql表达式 * @return */ public MatcherResult route(String vtab, String condition, String version); }