ShardingSphere代码阅读(二)

本文是ShardingSphere代码阅读的第二部分,主要探讨了ShardingSphere-JDBC-core的Java API和YAML配置两种方式实现数据插入不同数据库和表的原理。通过分析源码,展示了ShardingSphere如何通过配置和算法确定具体的分库分表策略,以及如何将逻辑SQL转换为实际的数据库操作,从而实现数据的正确插入。
摘要由CSDN通过智能技术生成

ShardingSphere代码阅读(二)


前言

上一篇说到阅读源码前需要准备什么,热身结束后开始,就需要探索阅读源码的最佳姿势,其实就是合适自己的一种阅读方式。
听我说


一、明确目标,带着问题看

在看源码之前,先要明确一下目标,带着一个问题深入源码中找答案,正所谓源码之下无秘密。如果没有带着疑问看源码是啃不下去的,再从官方提供的demo入手,慢慢摸索。
问题:ShardingSphere是如何实现把数据insert到不同的DB和tables
请开始你的表演

二、ShardingSphere-JDBC-core 源码

ShardingSphere-JDBC的demo中 有关实现有两种方式,分别是Java api和 yaml 配置,因此分别展开探究其实现

1.Java API

入口-过程-结果

图1
进行SQL的插入,首先需要创建对应的数据源实例,进入其中,看看是如何构建和区分不同实例的,根据上图的demo是根据枚举进行区别不同实例创建
图2
从上图中可以知道,会创建数据源的map和ShardingSphere规则参数,这两部分对应的就是有多少个物理表和库,其映射关系、规则的配置,那么到底如何将这两部分结合并且实现其功能的,继续往下探究ShardingSphere是如何设计的
图3
图4
从上图可以看出,modeConfig几乎可以确认的是,只要为空,必然new一个Memory 使用,除此之外,也是写死第一个参数,schemaName=logic_db,意思明确是logic数据库,那到底是有什么用处的呢?
图5
构建ShardingSphere和Mysql之间的关系,建立映射,
图6
从结果上看,是把两个实体数据库绑定在logic_db上了,
图7
logic_table也都是在初期写好的,在创建sharing规则配置时的策略配置,继续看看,当插入数据,是如何划分库表的图8
图9
从构建的关系来看,t_order表示一个logic表,并不是实质的的数据表,如果直接插入数据库中,必然会报错,告诉我们这张表并不存在,所以就去下图中的 createLogicSQL(sql),但是logic SQL可以很直观知道这个SQL是给ShardingSphere使用的
图10
构建后的logicSQL给kernelPro

如下: ```java @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration()); shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item"); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}")); shardingRuleConfig.setDefaultTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_${order_id % 2}")); Properties prop = new Properties(); prop.setProperty("sql.show", "true"); return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, prop); } private static TableRuleConfiguration getOrderTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}"); result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_id")); return result; } private static TableRuleConfiguration getOrderItemTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "ds${0..1}.t_order_item_${0..1}"); result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "item_id")); return result; } private static Map<String, DataSource> createDataSourceMap() { Map<String, DataSource> result = new HashMap<>(); BasicDataSource dataSource1 = new BasicDataSource(); dataSource1.setDriverClassName(com.mysql.cj.jdbc.Driver.class.getName()); dataSource1.set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值