shardingsphere5 自定义分片(sharding-algorithm)算法

背景 

在做分表时,需要自定义算法。 这里实现的算法是:  分表字段的 hashCode 取余。

算法


public class UserShardingAlgorithm implements StandardShardingAlgorithm<String> {

    public static String type = "USER_SHARDING_STRATEGY";

    /**
     * 分表数量
     */
    private int num;

    @Override
    public void init(Properties props) {
        this.num = Integer.valueOf(props.get("number").toString());
    }

    @Override
    public String getType() {
        return type;
    }

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
        String value = shardingValue.getValue();
        return shardingValue.getDataNodeInfo().getPrefix() + (value.hashCode() % num);
    }

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<String> shardingValue) {
        return availableTargetNames;
    }
}

测试代码

 修改下数据库配置,直接运行main 方法就可以。


    public static void main(String[] args) throws Exception {
        ShardingRuleConfiguration result = new ShardingRuleConfiguration();

        // 分表配置
        ShardingTableRuleConfiguration shardingTableRuleConfiguration =
                new ShardingTableRuleConfiguration("user", "user_read.user_$->{0..1}");

        //  分表字段, 分表算法
        StandardShardingStrategyConfiguration standardShardingStrategyConfiguration
                = new StandardShardingStrategyConfiguration("open_id", UserShardingAlgorithm.type);

        shardingTableRuleConfiguration.setTableShardingStrategy(standardShardingStrategyConfiguration);

        // 住建 key  生成策略
        KeyGenerateStrategyConfiguration keyGenerateStrategyConfiguration =
                new KeyGenerateStrategyConfiguration("id", "SNOWFLAKE");
        shardingTableRuleConfiguration.setKeyGenerateStrategy(keyGenerateStrategyConfiguration);

        result.getTables().add(shardingTableRuleConfiguration);

        // key 生成算法的 work_id
        Properties properties = new Properties();
        properties.put("work_id", new Random().nextInt(1024));
        result.getKeyGenerators().put("SNOWFLAKE", new AlgorithmConfiguration("SNOWFLAKE", properties));


        Properties userSharding = new Properties();
        userSharding.put("strategy", "standard");
        userSharding.put("number", 2);
        userSharding.put("algorithmClassName", UserShardingAlgorithm.class.getName());
        result.getShardingAlgorithms().put(UserShardingAlgorithm.type,
                new AlgorithmConfiguration("CLASS_BASED", userSharding));


        Map<String, DataSource> map = createDatasource();

        // 创建 db
        DataSource dataSource =
                ShardingSphereDataSourceFactory.createDataSource(map, Lists.newArrayList(result), new Properties());

        Connection connection = dataSource.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("insert into user (open_id) values (?)");

        preparedStatement.setString(1, UUID.randomUUID().toString());

        // 执行
        int execute = preparedStatement.executeUpdate();

        System.out.printf("ShardingJdbcDemo.main: " + execute);
        connection.close();
    }

    private static Map<String, DataSource> createDatasource() {

        DruidDataSource druidDataSource = new DruidDataSource();

        Map<String, DataSource> objectObjectHashMap = new HashMap<>();
        druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/user_read?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("123456");
        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        objectObjectHashMap.put("user_read", druidDataSource);
        return objectObjectHashMap;
    }

相关推荐

  1. shardingsphere5 定义分片sharding-algorithm算法

    2024-06-08 05:24:07       32 阅读
  2. 分治算法(Divide-and-Conquer Algorithm

    2024-06-08 05:24:07       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 05:24:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 05:24:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 05:24:07       87 阅读
  4. Python语言-面向对象

    2024-06-08 05:24:07       96 阅读

热门阅读

  1. Git概念用法

    2024-06-08 05:24:07       27 阅读
  2. Sed流编辑器总结

    2024-06-08 05:24:07       29 阅读
  3. 腾讯开源人像照片生成视频模型V-Express

    2024-06-08 05:24:07       25 阅读
  4. qgroundcontrol编程入门:探索无人机控制的新境界

    2024-06-08 05:24:07       27 阅读
  5. NLP基础知识讲解比较清楚的文章

    2024-06-08 05:24:07       25 阅读
  6. C++ 变量的声明和初始化方式

    2024-06-08 05:24:07       31 阅读
  7. Nginx介绍

    2024-06-08 05:24:07       34 阅读
  8. OCP学习笔记-007 SQL语言之一:DQL

    2024-06-08 05:24:07       23 阅读
  9. openresty lua修改响应体内容

    2024-06-08 05:24:07       34 阅读