2021年7月16日星期五

[zebra源码]如果定位到多个分库或分表怎么执行的?

假设分库分表情况如下

  • 分库 id0:分表  test_0 、 test_1
  • 分库 id1:   分表  test_2、  test_3

sql语句: select test.* from test

一、路由结果

DefaultRouter#router 路由出来的结果两个 RouterResult, 每个里边有多个分表的sql, 即所有分库下的所有test分表

dbName: id0sqls:- SELECT test_0.* \nFROM test_0- SELECT test_1.* \nFROM test_1dbName: id1sqls:- SELECT test_2.* \nFROM test_2- SELECT test_3.* \nFROM test_3

二、执行过程

如果路由定位到多个分库,会根据并发度n,将每个分库的sql语句 拆分成n个任务,放入线程池执行
默认单库并发度 concurrentLevel = 1, 执行过程为

(1) 执行分库id0里各分表的sql

  • 从分库id0 对应的数据源中一个数据连接,创建 (SELECT test_0.* \nFROM test_0)的 statement
  • 从分库id0 对应的数据源中一个数据连接,创建l (SELECT test_1.* \nFROM test_1 )的statement
  • 把这两个statement包裹到一个线程task中

(2) 执行分库id1里各分表的sql

  • 从分库id1 对应的数据源中一个数据连接,创建 (SELECT test_2.* \nFROM test_2 ) 的statement
  • 从分库id1 对应的数据源中一个数据连接,创建l (SELECT test_3.* \nFROM test_3 )的statement
  • 把这两个statement包裹到一个线程task中

(3) 把这两个task 丢到 SQLThreadPoolExecutor 中执行, 阻塞等待执行完毕

三、结果集合并

ShardResultSet#init() -> ShardResultSetMerger.merge 合并这四个 ResultSet

ShardResultSet 内部包含多个sql执行的结果集 ResultSet, 它实现了 ResultSet ,当从它遍历查询结果的时候,会根据 MergeContext( join、limit…etc)来组合结果数据

debug单测入口:

com.dianping.zebra.shard.jdbc.MultiDBPreparedStatementLifeCycleTest#testSingleRouterResult1

总结

路由定位到多个分库或分表的执行逻辑:

ShardPrepardStatement#normalSelectExecute 会依次执行这......

原文转载:http://www.shaoqun.com/a/884609.html

跨境电商:https://www.ikjzd.com/

拍拍:https://www.ikjzd.com/w/2205

csa认证:https://www.ikjzd.com/w/904

coles:https://www.ikjzd.com/w/2506


假设分库分表情况如下分库id0:分表test_0、test_1分库id1:分表test_2、test_3sql语句:selecttest.*fromtest一、路由结果DefaultRouter#router路由出来的结果两个RouterResult,每个里边有多个分表的sql,即所有分库下的所有test分表dbName:id0sqls:-SELECTtest_0.*\nFROMtest_0-SE
海带宝:https://www.ikjzd.com/w/1548
败欧洲:https://www.ikjzd.com/w/1555
2021最受中国游客欢迎的泰国酒店是哪家:http://www.30bags.com/a/421417.html
2021最温暖的打开方式:邀您来惠州共赴一场"暖冬之旅":http://www.30bags.com/a/435628.html
2021最新!邦涛海滩不完全攻略,带你了解普吉岛最豪华的度假区......:http://www.30bags.com/a/275368.html
2021最新版浙江温泉地图 收藏起来(组图):http://www.30bags.com/a/416766.html
和老外交换真实经历 又大又粗弄的我欲仙欲死:http://lady.shaoqun.com/a/247889.html
口述:小姨子与姐夫之间那些不要脸的事儿(中)(5/5):http://lady.shaoqun.com/a/82893.html
怎么从接吻中分辨出一个男人是否对你动了真情?:http://lady.shaoqun.com/a/424220.html
女人一旦有了婚外情,就会有以下表现。希望男人能尽早防范:http://lady.shaoqun.com/a/424221.html
接吻后,真正爱你的男人会交出这些"卡片":http://lady.shaoqun.com/a/424222.html
出轨的女人通常都有这些特点。你见过他们吗?:http://lady.shaoqun.com/a/424223.html

没有评论:

发表评论