5. 分片流程与 Sharding 核心问题
5.1 Bee (JDBC 部分) 的转换流程
Bee 基于 JDBC 操作数据库的流程如下:
1) 使用实体 Javabean (+ 条件表达式 Condtion,对应 SQL 的 where 表达式) 传达操作 DB 的信息;
2) 解析成 DB 能识别的 sql 语句;
3) 调用 JDBC 操作数据库;
4) 处理并返回操作结果。
其中 2)~4) 由 Bee 框架负责,用户一般只需要关注 1) 对应的接口。
5.2 Bee Sharding 分片流程
1. Sharding 拦截器进行拦截,计算和收集分片涉及的数据源名称和表名称等分片信息;
2. 对象解析引擎解析对象 / Condtion 并产生 sql 语句;
3.BeeSql 操作数据库引擎,判断是否有分片;
3.1 无分片或只是分片到一库一表,走无分片分支;
3.2 有分片,将走分片分支;
分片分为以下几种:一库多表;多库多表,只指定库 (全表);全库全表;(一库一表经过优化,不走分片)
BeeSql 操作数据库引擎处理检测缓存是否有数据,有则返回;
没有缓存,交由指定分片引擎处理;
根据分片引擎,选择 4,5,6,7,8 进行处理。
4. 无排序,无分页的,如 delete,update, 单条 insert;
ShardingModifyEngine 分片引擎
4.1 改写 sql 引擎对 sql 改写,并记录对应的 ds
4.2 ShardingBeeSQLModifyExecutorEngine 引擎,执行分片
a) 设置当前分片的 Ds;
b) 交由 BeeSql 操作数据库引擎处理;
路由到指定 Ds, 并获取相关 Connection;
执行 Suid 操作,并返回结果;
4.3 结果合并引擎合并结果
5. 查询分片
ShardingSelectEngine 分片引擎
5.1
a) 若有分页,改写分页语句;
改写 sql (OrderByPagingRewriteSql),
并记录对应的 ds
5.2 若是单库多表,且有分页,支持 union all, 不是多表查询,优化查询;
//b) sql 语句替换表下标
//c)union all
//d) 生成新的复合查询语句;
//e) 加排序子句;(如果有)
//f) 加分页,取指定页的一页记录
//g) 调整参数缓存
5.3 ShardingBeeSQLExecutorEngine 引擎,执行分片
a) 设置当前分片的 Ds;
b) 交由 BeeSql 操作数据库引擎处理;
路由到指定 Ds, 并获取相关 Connection;
执行 Suid 操作,并返回结果;
5.4 结果合并引擎合并结果
5.5 排序装饰
5.6 分页装饰
获取指定的一页数据
5.7 记录结果到缓存;
5.8 返回
6. 查询函数分片
ShardingSelectFunEngine 分片引擎
6.1 改写 sql 引擎对 sql 改写 (更新具体下标), 并记录对应的 ds
6.2 ShardingBeeSQLFunExecutorEngine 引擎,执行分片
a) 设置当前分片的 Ds;
b) 交由 BeeSql 操作数据库引擎处理;
路由到指定 Ds, 并获取相关 Connection;
执行 Suid 操作,并返回结果;
6.3 结果合并引擎合并结果
6.4 另外,avg 要使用专门的 ShardingAvgEngine,进行改写 Sql, 合并结果,并处理结果.
7. 查询 Json 分片
ShardingSelectJsonEngine 分片引擎
该种处理,与 5 的查询分片引擎很类似。只是最后要将结果由 List 转为 Json.
8.ShardingSelectListStringArrayEngine
分片的 select 操作
专门为处理返回值是 List<String []> 的类型
5.3 Sharding 核心问题
5.3.1 改写 SQL
5.3.2 结果合并
5.3.3 排序
5.3.4 分页
5.3.5 查询 Json
Bee 源码地址:
https://gitee.com/automvc/bee