简介
趁着seata的热乎气,继续谈谈分布式数据的问题,今天谈谈对shardingsphere-jdbc的初识。
分析
先看看对shardingsphere-jdbc的整体认识,看看来自官网的一张图。
第一想法是什么?图画的不错,不不,好像是拿着Sharding-JDBC取代了jdbc,通过Sharding-JDBC来访问数据库,靠猜不行看看代码怎么搞的,这种入门程序就不多说了,直接到官网截一段使用的代码片段。
呀哈,确定过眼神好像见过这个图,没毛病老铁,seata也是到DataSource这里来搞事情。稍等片刻,来个你画我猜,是不是这个样子的,结合代码配置来看,配置了多个数据源,并配置了对应的规则,这么一来岂不就是,对要执行的sql进行解析,看看应该放到哪个数据源去执行,这不就达到目的了吗。比如有根据id奇偶来路由到不同库来执行,id是奇数就符合了数据源1的规则,那就定位了数据源1,那就到数据源1拿连接执行sql,perfect,还是那句话靠猜不踏实啊,看看代码去。

这里看到ShardingDataSourceFactory搞了一个ShardingDataSource,看看怎么取连接。

这里看到ShardingDataSource搞了一个ShardingConnection,再去搞一个Statement。

这里看到ShardingConnection搞了一个ShardingPreParedStatement,最后看一张整体关系图。
接下来就看看sql的执行吧。

简单看看这里的逻辑,prepare、executeQuery。

既然是为了得到ExecutionContext,先瞧瞧它这里的SqlStatementContext和ExecutionUnits。
这里意图就很清晰了,有个这个组件和ShardingPreParedStatement执行一个sql的全部条件就都具备了,statement、sql、parameter,那就看看这个组件怎么初始化的,看上面代码注意到都与RouteContext有关。那就看看RouteContext。
这里也很清楚的说明了路由意图,路由器通过sql和路由规则得到路由结果,将路由结果保存到路由上下文,注意路由节点和路由单元的结构。
到这prepare就很清楚了,就是准备好执行上下文,继续看看executeQuery,其实这个也就没什么了,有了执行上下文,那就真正去执行jdbc就行了。
总结
综上来看Sharding-JDBC就是在sql执行前根据配置的规则得到真正的sql后,然后jdbc执行sql。