(21)首先从SQLParsedResult获取statement,逻辑表和物理表放入到tableMapping;创建对应的重写visitor,然后调用重写,返回重写后的sql;重写sql完成后,处理一下hint语句,最后把结果放到routerResult。
(22) 如果是多查询的sql重写,如下:
也是循环进行每个重写,返回对应的sql
1.5 执行executableCheck,进行检查
检查完成后,回到ShardStatement.executeQueryWithFilter方法
组装结果ShardResultSet
1.7 有orderBy和limit的单个查询,用切分成多个的方式进行数据获取
(1) 如果是单表查询,直接设置下限为0,并调用normalSelectExecute执行原始sql
(2) 根据sql解析出parseResult
(3) 根据路由数拆分offset,后面进行count 查询
1.8 普通查询直接调用normalSelectExecute
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的执行结果