ShardingSphere-JDBC:数据分片源码篇
在上篇我们已经通过一个简单的demo(ShardingSphere-JDBC:数据分片实战篇)实现了数据分片 , 在本文我们会通过深入源码分析"ShardingSphere-JDBC"是如何实现改写sql语句的?
也就是说 , 我们只是写了“SELECT*FROMt_orderWHEREorder_id=?ANDuser_id=?” , 他是如何做到数据改写 , 路由到“ds1库t_order1表”的 。
下面我们会按照上篇实战的demo逐行去分析 。
获取数据源
文章图片
UML时序图
文章图片
在这里主要就是初始化运行时上下文环境 , 包括:
初始化数据源 。
初始化策略 。
初始化执行引擎 。
初始化SQL解析器引擎 。
初始化事务管理器 。
建立连接
文章图片
UML时序图
文章图片
在这里的操作主要包括:
获取数据源 。
获取运行时上下文环境 。
获取事务管理器 。
文章图片
获取预编译SQL语句
文章图片
在这里的操作主要包括:
获取数据库连接 。
获取sql语句 。
获取ParameterMetaData 。
获取PreparedQueryPrepareEngine 。
【ShardingSphere-JDBC:数据分片源码篇】获取PreparedStatementExecutor 。
获取BatchPreparedStatementExecutor 。
文章图片
执行sql语句
文章图片
UML时序图
文章图片
在这里的操作主要包括:
清除预编译执行器的缓存 。
获取执行上下文 。
初始预编译执行器的缓存 。
合并执行查询 。
获取结果集 。
释放资源 。
文章图片
在这里我们重点关注的是第2点也就是执行prepare方法 , 它在这个方法中是如何改写sql语句的?
文章图片
首先它会调BasePreparedEngine.prepare方法 , 在这里调用executeRoute方法生成RouteContext , 最终在DataNodeRouter.route方法中生成RouteContext对象 。
注意 , 在这个对象里有一个属性很重要 , 就是“routeResult” 。 在routeResult中有两个属性 , 分别是originalDataNodes和routeUnits , 接下来我们会用到 。
文章图片
生成ExecutionContext , 这个是返回值 , 我们先不管 , 重点是看一下executeRewrite方法 , 从字面意思是就是重写执行语句 。
文章图片
在该方法中 , 我们只看最后一行也就是rewrite方法 , 这个方法只有5行代码 , 我们看一下只是给结果循环赋值 。
文章图片
我们在看newSQLRouteRewriteEngine.rewrite , 在这里它会获取routeResult的routeUnits属性 , 进行循环遍历 , 在循环遍历中有一个很重要的方法“newRouteSQLBuilder(sqlRewriteContext,each)).toSQL” , toSQL方法 , 看方法名的意思是重写sql语句 。
- text|《2021大数据产业年度创新技术突破》榜重磅发布丨金猿奖
- 酷睿处理器|关键数据出炉,京东比阿里差远了
- 财智干货|数智化发展任重道远,财务中台提升数据服务价值 | 大数据
- 央媒表态后,联想关键数据出炉,柳传志这回要扳回一局?
- 数据库|OPPO悄悄上新机,骁龙8核+5000mAh电池,256G仅售1599元
- 数据仓库|红米真我moto三款骁龙870手机对比:2000元以内,谁更值得买?
- 中文|爱数智慧CEO张晴晴:基于”情感“的人机交互,要从底层数据开始
- B费全场数据:2次射正打入2球,3次抢断、1次拦截
- iPhone|东芝NAS硬盘N300系列+ORICO硬盘柜=“数据保险柜”
- 数据库|丁磊致歉“鱼眼观察”作者并回应:已撤回删稿函