当前位置:   article > 正文

shardingjdbc 5.x 实现 自定义分片策略(分库和分表)_shardingsphere-jdbc 5 自定分片

shardingsphere-jdbc 5 自定分片

在ShardingJdbc 5.x版本中,使用SPI方式进行分片策略的注入。

1. 编写分库策略

  1. package com.demo.server.config;
  2. import java.util.Collection;
  3. import java.util.Properties;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
  7. import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
  8. import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
  9. import org.springframework.beans.factory.annotation.Value;
  10. import org.springframework.stereotype.Component;
  11. @Component
  12. public class DatabaseShardingAlgorithm implements StandardShardingAlgorithm<String> {
  13. private Properties props;
  14. @Value("${sharding.dbshardcount}")
  15. private Long dbshardCount = 1l;
  16. public Properties getProps() {
  17. return props;
  18. }
  19. public void setProps(Properties props) {
  20. this.props = props;
  21. }
  22. @Override
  23. public String doSharding(Collection<String> databaseNames, PreciseShardingValue<String> shardingValue) {
  24. Long lShard = 0l;
  25. String value = shardingValue.getValue();
  26. String number = getNumber(value);
  27. // 字符串转换为数字
  28. lShard = Long.parseLong(number);
  29. // 取最低位
  30. // 这里假设分为10个库,0-9
  31. Long shardMod = lShard % 10;
  32. for (String database : databaseNames) {
  33. if (database.endsWith(String.valueOf(shardMod))) {
  34. return database;
  35. }
  36. }
  37. return "";
  38. }
  39. @Override
  40. public String getType() {
  41. return "SHLD_DBSHARD";
  42. }
  43. @Override
  44. public void init() {
  45. // 这里可以进行必要的初始化
  46. }
  47. @Override
  48. public Collection<String> doSharding(Collection<String> availableTargetNames,
  49. RangeShardingValue<String> shardingValue) {
  50. // 这里可以定义范围分片策略
  51. return null;
  52. }
  53. String getNumber(String str) {
  54. // 只允数字
  55. String regEx = "[^0-9]";
  56. Pattern p = Pattern.compile(regEx);
  57. Matcher m = p.matcher(str);
  58. // 替换与模式匹配的所有字符(即非数字的字符将被"0"替换)
  59. return m.replaceAll("0").trim();
  60. }
  61. }

2. 在 resource 文件夹下创建 META-INF/services文件夹,并在该文件夹下创建文件名为org.apache.shardingsphere.sharding.spi.ShardingAlgorithm的文件,并在文件中写入分片策略类全路径名。

com.demo.server.config.DatabaseShardingAlgorithm

3.  在ShardingJdbcConfig中,配置分表算法时指定该分片策略名称以及分库策略的属性,该属性可以在分库策略中使用。

  1. Properties pTable = new Properties();
  2. pTable.setProperty("dbshardCount", String.valueOf(dbshardCount));
  3. // 设置分库策略
  4. ShardingSphereAlgorithmConfiguration ssacdb = new ShardingSphereAlgorithmConfiguration(
  5. "SHLD_DBSHARD", pTable);
  6. shardingRuleConfiguration.getShardingAlgorithms().put("dbShardingAlgorithm", ssacdb);

设置了分库属性以及分库算法的类型,作为分库算法的配置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/401599
推荐阅读
相关标签
  

闽ICP备14008679号