本文章适用于初学者demo;或概念理解中策略都在git中打好了tag想要学习那种策略仔细阅读redme即可;
具体代码与明细见:https://github.com/ssy-githup/shardingjdbc
对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,只支持单分片键
对应算法:复和分片算法
对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,支持多分片键
使用Groovy的表达式,提供对sql语句中的=和in的分片操作支持,只支持单分片键
对应算法:hint分片算法
通过Hint而非SQL解析的方式分片的策略
分片策略
io.shardingsphere.core.routing.strategy.none.NoneShardingStrategy
分片算法:ShardingAlgorithm
io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm
io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm
io.shardingsphere.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm
io.shardingsphere.api.algorithm.sharding.hint.HintShardingAlgorithm
对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发
StandardShardingStrategy只支持单分片键,提供:
PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。
PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。
ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
Hint分片指的是对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。
有些SQL语句比较复杂比如说有(a = var or b = var) and member_id = N,这个时候druid sqlparser并不支持的时候,虽然可以通过多数据源解决,但是我们不希望架构搞得太复杂,这种情况下,可以通过sharding-jdbc的Hint分片策略来实现各种sharding-jdbc不支持的语法的限制。
因为Hint分片策略是绕过SQL解析的,所以对于这些比较复杂的需要分片的查询,采用Hint分片策略性能可能会更好。
hint策略需要实现:io.shardingjdbc.core.api.algorithm.sharding.hint.HintShardingAlgorithm接口。
通过解析SQL语句提取分片键列与值并进行分片是ShardingSphere对SQL零侵入的实现方式。若SQL语句中没有分片条件,则无法进行分片,需要全路由。
shardingSphere不像mycat一样完全不侵入项目,使用此种方式需要修改配置文件
# 分库配置
# 读写分离配置
sharding.jdbc.config.masterslave.name=dataSource
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
#配置master的数据源名称
sharding.jdbc.config.masterslave.master-data-source-name=master
#配置slave的数据源名称
sharding.jdbc.config.masterslave.slave-data-source-names=slave
# 打印SQL
sharding.jdbc.config.props.sql.show=true