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语句 。 
- 创业|八成互联网电视非法采集用户数据, 彩电企业怎么办?
- 新书推荐 │ 大数据算法设计与分析
- |一招教你入门数据可视化!
- 固态硬盘|PCI-E 4.0新选择,西部数据WD_BLCK SN770固态硬盘体验
- 原神|原神:说好数据互通的,为什么自己不能用电脑玩?多数人都没注意
- 客户端|多平台分析618数据,看清家居人未来方向!
- 芯片|芯片数据出炉!情况出现反转,美企们坐不住了
- 网络安全|数据安全的三大特性!重要性和意义!
- 海尔|唯品会京东的618数据中,一个“反常”现象被忽视了
- 数据资产管理和数据治理是什么关系?
