Sharding-JDBC 分片策略
- Sharding-JDBC对于分片策略存有两种维度:
- 数据源分片策略(DatabaseShardingStrategy):数据被分配的目标数据源
- 表分片策略(TableShardingStrategy):数据被分配的目标表
- 两种分片策略API完全相同,但是表分片策略是依赖于数据源分片策略的(即:先分库,然后才有分表)
- 结构图如下:
- Sharding-JDBC的数据分片策略
- Sharding-JDBC的分片策略包含了分片键和分片算法
- 分片键
- 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片
- 分片算法
- 通过分片算法将数据分片,支持通过=、BETWEEN和IN分片。分片算法需要应用方开发者自行实现,可实现的灵活度非常高
- 分片策略
- standard:标准分片策略,对应StandardShardingStrategy
- 提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持
- StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法
- PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。
RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置
RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理
- complex:复合分片策略,对应ComplexShardingStrategy
- 提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持
- ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度
- inline:行表达式分片策略,对应InlineShardingStrategy
- 使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,
- 只支持单分片键
- 对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0 到 t_user_7
- hint:Hint分片策略,对应HintShardingStrategy,通过Hint而非SQL解析的方式分片的策略
- 对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段
- 例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用
- none:不分片策略,对应NoneShardingStrategy。不分片的策略
- standard:标准分片策略,对应StandardShardingStrategy
- 自定义分片算法
- Sharding提供了以下4种算法接口
- PreciseShardingAlgorithm
- RangeShardingAlgorithm
- HintShardingAlgorithm
- ComplexKeysShardingAlgorithm
- Sharding提供了以下4种算法接口