主要功能
这部分表示的是Sharding-JDBC的入口API,采用工厂方法的形式提供。
ShardingDataSourceFactory支持分库分表、读写分离操作。
MasterSlaveDataSoureceFactory支持读写分离操作。
这部分表示的是Sharding-JDBC的配置对象,提供灵活多变的配置方式。
TableRuleConfiguration,它包含分片配置规则。
MasterSlaveRuleConfiguration,它包含的是读写分离的配置规则
ShardingRuleConfiguration,主入口,它包含多个TableRuleConfiguration,也可以包含多个MasterSlaveRuleConfiguration
这部分表示的是内部对象,由Sharding-JDBC内部使用,应用开发者无需关注。
Sharding-JDBC通过ShardingRuleConfiguration和MasterSlaveRuleConfiguration生成真正的规则对象,最终生成要使用的DataSource。
Sharding-JDBC初始化流程,根据配置信息生成configuration对象,通过Factory将configuration对象转化为Rule对象,通过Factory将Rule对象与DataSource对象进行封装,使用Sharding-JDBC进行分库分表操作。
Sharding-JDBC的使用
引入maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-core -->
org.apache.shardingsphere</groupId>
sharding-jdbc-core</artifactId>
4.1.1</version>
</dependency>
规则配置
Sharding-JDBC可以通过Java、YAML、Spring命名空间和Spring Boot Starter四种方式配置,开发者根据场景选择合适的配置方式。
创建DataSource
通过ShardingDataSourceFactory工厂和规则配置对象获取ShardingDataSource,然后即可通过DataSource选择使用原生JDBC开发,或者使用JPA,Mybatis等ORM工具。
真实表:数据库中真实存在的物理表。例如b_order0、b_order1。
逻辑表:在分片之后,同一类表结构的名称(总称)。例如b_order。
数据节点:在分片之后,由数据源和数据表组成。例如ds0.b_order1。
绑定表:指的是分片规则一致的关系表(主表、子表),例如b_order和b_order_item,均按照order_id分片,则此两个表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,可以提高关联查询的效率。
例如:
如果没有配置绑定关系,则采用笛卡尔积关联查询4条SQL语句,如下
select * from b_order0 o left join b_order_item0 i on o.order_id = i.order_id where o.order_id in(10,11)
select * from b_order0 o left join b_order_item1 i on o.order_id = i.order_id where o.order_id in(10,11)
select * from b_order1 o left join b_order_item0 i on o.order_id = i.order_id where o.order_id in(10,11)
select * from b_order1 o left join b_order_item1 i on o.order_id = i.order_id where o.order_id in(10,11)
配置绑定,如下
b_order:b_order0,b_order1
b_order_item: b_order_item0,b_order_item1
配置绑定关系后,只需查询2条SQL语句
select * from b_order0 o left join b_order_item0 i on o.order_id = i.order_id where o.order_id in(10,11)
select * from b_order1 o left join b_order_item1 i on o.order_id = i.order_id where o.order_id in(10,11)
广播表,在使用中,有些表没必要做分片,例如字典表、省份信息等,因为他们数据量不大,而且这种表可能需要与海量数据的表进行关联查询。广播表会在不同的数据节点上进行存储,存储的表结构和数据完全相同。
相当于MyCat的全局表。
稳定支持
全面支持DQL、DML、DDL、DCL、TCL和常用的DAL。支持分页、去重、排序、分组、聚合、表关联等复杂查询。
SELECT 主语句
SELECT select_expr [, select_expr ...] FROM table_reference [, table_reference ...]
[WHERE predicates]
[GROUP BY {col_name | position} [ASC | DESC], ...]
[ORDER BY {col_name | position} [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
select_expr
* |
[DISTINCT] COLUMN_NAME [AS] [alias] |
(MAX | MIN | SUM | AVG)(COLUMN_NAME | alias) [AS] [alias] |
COUNT(* | COLUMN_NAME | alias) [AS] [alias]
table_reference
tbl_name [AS] alias] [index_hint_list]
| table_reference ([INNER] | {LEFT|RIGHT} [OUTER]) JOIN table_factor [JOIN ON conditional_expr | USING (column_list)]
SELECT * FROM (SELECT * FROM t_order WHERE order_id = 1) o WHERE o.order_id = 1;
实验性支持
实验性支持,特指使用Federation执行引擎提供支持。该引擎处于快速开发中,用户虽基本可用,但仍需大量优化,是实验性产品。
子查询
子查询和外层查询未同时指定分片键,或分片键的值不一致时,由Federation执行引擎提供支持。
跨库关联查询
当关联查询中的多个表分布在不同的数据库实例上时,由Federation执行引擎提供支持。假设t_order和t_order_item是多数据节点的分片表,并且未配置绑定表规则,t_user和t_user_role是分布在不同的数据库实例上的单表,那么Federation执行引擎能够支持如下的关联查询。
SELECT * FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1;
SELECT * FROM t_order o INNER JOIN t_user u ON o.user_id = u.user_id WHERE o.user_id = 1;
SELECT * FROM t_order o LEFT JOIN t_user_role r ON o.user_id = r.user_id WHERE o.user_id = 1;
SELECT * FROM t_order_item i LEFT JOIN t_user u ON i.user_id = u.user_id WHERE i.user_id = 1;
SELECT * FROM t_order_item i RIGHT JOIN t_user_role r ON i.user_id = r.user_id WHERE i.user_id = 1;
SELECT * FROM t_user u RIGHT JOIN t_user_role r ON u.user_id = r.user_id WHERE u.user_id = 1;
不支持
不支持CASE WHEN 语句
SELECT子句不支持*和内置分布式主键生成器。
查询列式函数表达式时,查询列前不能使用表名,只能使用表别名。
Inline可以简化数据节点和分片算法配置信息,主要是解决实现配置简化、配置一体化。
Inline表达式说明
${begin…end}表示范围区间, ${[unit1,unit2,unitx]}表示枚举值。inline表达式中连续多个 ${…}表达式,整个inline最终的结果将会根据每个子表达式的结果进行笛卡尔积组合,例如正式表inline表达式如下:
dbtbl_${['online','offline']}_${1..3}
dbtbl_$->{['online','offline']}_$->{1..3}
最终会解析为dbtbl_online_1,dbtbl_online_2,dbtbl_online_3,dbtbl_offline_1,dbtbl_offline_2,dbtbl_offline_3 这6张表。
数据节点配置
字符串中使用${}来嵌入groovy代码,下面的表达式中data_source_是字符串前缀,id%2+1是groovy代码。
data_source_${id%2+1}
结果为data_source_1,data_source_2
db0、db1,每个库下面都有order0,order1两张表,行表达式配置如下
db${0..1}.order${0..1}
db0下面有order0、order1两张表,db1下面有order2、order3、order4四张表,配置如下
db0.order${0..1},db1.order${2..4}