hint
配置文件
spring:shardingsphere:datasource:ds0:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8username: rootpassword: rootnames: ds0sharding:tables:x_user:actual-data-nodes: ds0.x_user_$->{0..1}table-strategy:hint:algorithmClassName: org.sharding.shardingsphere.TableHintShardingAlgorithmdatabaseStrategy:hint:algorithmClassName: org.sharding.shardingsphere.DbHintShardingAlgorithm
HintShardingAlgorithm
algorithmClassName配置项指定的算法类要实现HintShardingAlgorithm接口。
public class TableHintShardingAlgorithm implements HintShardingAlgorithm<Integer> {public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Integer> shardingValue) {return availableTargetNames;}}
availableTargetNames表示可用的目标名称,对于数据库就是可用的数据库,对于表就是可用的表,是通过配置项actual-data-nodes配置的。shardingValue表示可用的分片值,通过HintManager配置的。
HintManager
在执行sql前需要通过HintManager指定分片值。
public List list() {HintManager.clear();// HintManager API 工具类实例HintManager hintManager = HintManager.getInstance();// 直接指定对应具体的数据库hintManager.addDatabaseShardingValue("x_user",0);hintManager.addDatabaseShardingValue("x_user",1);// 设置表的分片健hintManager.addTableShardingValue("x_user" , 0);hintManager.addTableShardingValue("x_user" , 1);hintManager.addTableShardingValue("x_user" , 2);return xUserMapper.select();}
inline
配置项
spring:shardingsphere:datasource:ds0:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8username: rootpassword: rootnames: ds0sharding:t_order:actual-data-nodes: ds0.t_order_$->{0..2}table-strategy:inline:sharding-column: order_idalgorithm-expression: t_order_$->{order_id % 3}
standard
配置信息
spring:shardingsphere:datasource:ds0:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8username: rootpassword: rootnames: ds0sharding:tables:t_pay:actual-data-nodes: ds0.t_pay_$->{0..2}table-strategy:standard:sharding-column: pay_idprecise-algorithm-class-name: org.sharding.shardingsphere.TablePreciseShardingAlgorithmrange-algorithm-class-name: org.sharding.shardingsphere.TableRangeShardingAlgorithm
precise-algorithm-class-name:精确分片算法类名称,用于=和IN。。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器。range-algorithm-class-name:范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器。
PreciseShardingAlgorithm
/*** @Author: licheng* @Date: 2021/7/3 20:02*/public class TablePreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {int l = shardingValue.getValue() % availableTargetNames.size();String str = String.valueOf(l);for (String tb : availableTargetNames) {if (tb.endsWith(str)) {return tb;}}return null;}}
availableTargetNames表示可用目标,对于数据源分片表示可用的数据源,对于表分片表示可用的表,就是
actual-data-nodes配置的值。shardingValue表示分片值。
RangeShardingAlgorithm
/*** @Author: licheng* @Date: 2021/7/3 20:07*/public class TableRangeShardingAlgorithm implements RangeShardingAlgorithm<Integer> {public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Integer> shardingValue) {return availableTargetNames;}}
RangeShardingValue表示范围分片值,availableTargetNames是可用目标。
complex
支持多分片键,提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。
配置项
spring:shardingsphere:sharding:tables:t_msg:actual-data-nodes: ds0.t_msg_$->{0..2}table-strategy:complex:sharding-columns: src_user_id,dest_user_idalgorithm-class-name: org.sharding.shardingsphere.TableComplexKeysShardingAlgorithm
sharding-columns指定分片列,algorithm-class-name指定算法类,需要实现ComplexKeysShardingAlgorithm接口。
ComplexKeysShardingAlgorithm
ComplexKeysShardingAlgorithm是complex分片策略的分片算法类。
/*** @Author: licheng* @Date: 2021/7/4 0:50*/public class TableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm {public Collection<String> doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) {System.out.println(shardingValue.getColumnNameAndRangeValuesMap());System.out.println(shardingValue.getColumnNameAndShardingValuesMap());return availableTargetNames;}}
availableTargetNames:可用目标。ComplexKeysShardingValue:分片值,getColumnNameAndRangeValuesMap方法返回between的分片值,getColumnNameAndShardingValuesMap代表=和in的分片值。
