(21)首先从SQLParsedResult获取statement,逻辑表和物理表放入到tableMapping;创建对应的重写visitor,然后调用重写,返回重写后的sql;重写sql完成后,处理一下hint语句,最后把结果放到routerResult。


  (22) 如果是多查询的sql重写,如下:


数据库中间件Zebra 分库分表源码分析02_sql


也是循环进行每个重写,返回对应的sql

1.5 执行executableCheck,进行检查


数据库中间件Zebra 分库分表源码分析02_并行执行_02


检查完成后,回到ShardStatement.executeQueryWithFilter方法

数据库中间件Zebra 分库分表源码分析02_sql_03


组装结果ShardResultSet


1.7 有orderBy和limit的单个查询,用切分成多个的方式进行数据获取


(1) 如果是单表查询,直接设置下限为0,并调用normalSelectExecute执行原始sql


(2) 根据sql解析出parseResult


(3) 根据路由数拆分offset,后面进行count 查询


1.8 普通查询直接调用normalSelectExecute


数据库中间件Zebra 分库分表源码分析02_sql_04


1.9 调用normalSelectExecute方法的 executeQueryByOriginal ,获得每个分片原始查询结果的List


1. 如果只有1个sql,就直接串行执行,调用stmt.executeQuery执行sql语句


2. 如果有多个sql,就并行执行,从路由结果中获取并行级别,并行级别小于等于1,就for循环执行


3. 循环要执行的sql,创建对应的statement,并且创建对应的task


4. 执行task任务,是调用SQLThreadPoolExecutor的invokeSQLs,最后通过future汇总各个task的执行结果