hint

配置文件

  1. spring:
  2. shardingsphere:
  3. datasource:
  4. ds0:
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. url: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8
  7. username: root
  8. password: root
  9. names: ds0
  10. sharding:
  11. tables:
  12. x_user:
  13. actual-data-nodes: ds0.x_user_$->{0..1}
  14. table-strategy:
  15. hint:
  16. algorithmClassName: org.sharding.shardingsphere.TableHintShardingAlgorithm
  17. databaseStrategy:
  18. hint:
  19. algorithmClassName: org.sharding.shardingsphere.DbHintShardingAlgorithm

HintShardingAlgorithm

algorithmClassName配置项指定的算法类要实现HintShardingAlgorithm接口。

  1. public class TableHintShardingAlgorithm implements HintShardingAlgorithm<Integer> {
  2. public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Integer> shardingValue) {
  3. return availableTargetNames;
  4. }
  5. }

availableTargetNames表示可用的目标名称,对于数据库就是可用的数据库,对于表就是可用的表,是通过配置项actual-data-nodes配置的。shardingValue表示可用的分片值,通过HintManager配置的。

HintManager

在执行sql前需要通过HintManager指定分片值。

  1. public List list() {
  2. HintManager.clear();
  3. // HintManager API 工具类实例
  4. HintManager hintManager = HintManager.getInstance();
  5. // 直接指定对应具体的数据库
  6. hintManager.addDatabaseShardingValue("x_user",0);
  7. hintManager.addDatabaseShardingValue("x_user",1);
  8. // 设置表的分片健
  9. hintManager.addTableShardingValue("x_user" , 0);
  10. hintManager.addTableShardingValue("x_user" , 1);
  11. hintManager.addTableShardingValue("x_user" , 2);
  12. return xUserMapper.select();
  13. }

inline

配置项

  1. spring:
  2. shardingsphere:
  3. datasource:
  4. ds0:
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. url: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8
  7. username: root
  8. password: root
  9. names: ds0
  10. sharding:
  11. t_order:
  12. actual-data-nodes: ds0.t_order_$->{0..2}
  13. table-strategy:
  14. inline:
  15. sharding-column: order_id
  16. algorithm-expression: t_order_$->{order_id % 3}

需要配置分片列和算法表达式。

standard

配置信息

  1. spring:
  2. shardingsphere:
  3. datasource:
  4. ds0:
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. url: jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8
  7. username: root
  8. password: root
  9. names: ds0
  10. sharding:
  11. tables:
  12. t_pay:
  13. actual-data-nodes: ds0.t_pay_$->{0..2}
  14. table-strategy:
  15. standard:
  16. sharding-column: pay_id
  17. precise-algorithm-class-name: org.sharding.shardingsphere.TablePreciseShardingAlgorithm
  18. range-algorithm-class-name: org.sharding.shardingsphere.TableRangeShardingAlgorithm

precise-algorithm-class-name:精确分片算法类名称,用于=和IN。。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器。range-algorithm-class-name:范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器。

PreciseShardingAlgorithm

  1. /**
  2. * @Author: licheng
  3. * @Date: 2021/7/3 20:02
  4. */
  5. public class TablePreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
  6. public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
  7. int l = shardingValue.getValue() % availableTargetNames.size();
  8. String str = String.valueOf(l);
  9. for (String tb : availableTargetNames) {
  10. if (tb.endsWith(str)) {
  11. return tb;
  12. }
  13. }
  14. return null;
  15. }
  16. }

availableTargetNames表示可用目标,对于数据源分片表示可用的数据源,对于表分片表示可用的表,就是
actual-data-nodes配置的值。shardingValue表示分片值。

RangeShardingAlgorithm

  1. /**
  2. * @Author: licheng
  3. * @Date: 2021/7/3 20:07
  4. */
  5. public class TableRangeShardingAlgorithm implements RangeShardingAlgorithm<Integer> {
  6. public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Integer> shardingValue) {
  7. return availableTargetNames;
  8. }
  9. }

RangeShardingValue表示范围分片值,availableTargetNames是可用目标。

complex

支持多分片键,提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。

配置项

  1. spring:
  2. shardingsphere:
  3. sharding:
  4. tables:
  5. t_msg:
  6. actual-data-nodes: ds0.t_msg_$->{0..2}
  7. table-strategy:
  8. complex:
  9. sharding-columns: src_user_id,dest_user_id
  10. algorithm-class-name: org.sharding.shardingsphere.TableComplexKeysShardingAlgorithm

sharding-columns指定分片列,algorithm-class-name指定算法类,需要实现ComplexKeysShardingAlgorithm接口。

ComplexKeysShardingAlgorithm

ComplexKeysShardingAlgorithm是complex分片策略的分片算法类。

  1. /**
  2. * @Author: licheng
  3. * @Date: 2021/7/4 0:50
  4. */
  5. public class TableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm {
  6. public Collection<String> doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) {
  7. System.out.println(shardingValue.getColumnNameAndRangeValuesMap());
  8. System.out.println(shardingValue.getColumnNameAndShardingValuesMap());
  9. return availableTargetNames;
  10. }
  11. }

availableTargetNames:可用目标。ComplexKeysShardingValue:分片值,getColumnNameAndRangeValuesMap方法返回between的分片值,getColumnNameAndShardingValuesMap代表=和in的分片值。