美文网首页
3 Sharding-Sphere初体验

3 Sharding-Sphere初体验

作者: longxingxiu | 来源:发表于2019-03-11 21:32 被阅读0次

一、官方例程解读

官方例程 raw-jdbc-nodep-example 解读

    /**
     * Sharding类型:
     * 1 分库demo
     * 2 分表demo
     * 3 同时分库和分表demo
     * 4 主从demo
     * 5 Sharding主从demo
     */

1. Demo1 分库

  • 数据源配置
    @Override
    public DataSource getDataSource() throws SQLException {

        /**
         * 初始化ShardingRule配置类
         */
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();

        /**
         * 设置TableRule和ItemRule表规则
         */
        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());

        /**
         * 设置默认的分库策略配置(setDefaultDatabaseShardingStrategyConfig方法是分库方法)
         * (分库依据是参数user_id, 分库算法是表名最后一个后缀2取余)
         */
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
                new InlineShardingStrategyConfiguration("user_id",
                        "demo_ds_${user_id % 2}"));
        /**
         * 获取数据源对象
         */
        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new HashMap<String, Object>(), new Properties());
    }

2. Demo2 分表

  • 数据源配置
    public DataSource getDataSource() throws SQLException {
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();

        /**
         * 设置t_order和t_order_item的表规则
         */
        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());

        /**
         * 将表t_order和t_order_item添加到绑定的表组中
         */
        shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");

        /**
         * 设置分表策略(分表依据列order_id)
         */
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("order_id",
                        new PreciseModuloShardingTableAlgorithm()));
        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(),
                shardingRuleConfig, new HashMap<String, Object>(), new Properties());
    }

-. 分表配置

    private static TableRuleConfiguration getOrderTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration();

        result.setLogicTable("t_order");
        // 设置实际的数据节点(即哪张表,表0或者表1)
        result.setActualDataNodes("demo_ds.t_order_${[0, 1]}"); // 分表才会设置
        // 设置主键生成列
        result.setKeyGeneratorColumnName("order_id");
        return result;
    }
  • 运行结果


    demo2.png

3. Demo3 同时分库分表

  • 数据源配置
    @Override
    public DataSource getDataSource() throws SQLException {
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();

        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
        shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");

        /**
         * 分库策略配置DatabaseSharding
         */
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
                new InlineShardingStrategyConfiguration("user_id",
                        "demo_ds_${user_id % 2}"));
        /**
         * 分表策略配置TableSharding
         */
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("order_id",
                        new PreciseModuloShardingTableAlgorithm()));

        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(),
                shardingRuleConfig, new HashMap<String, Object>(), new Properties());
    }

-. 分库分表配置

    private static TableRuleConfiguration getOrderTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration();

        result.setLogicTable("t_order");
        /**
         * 分表依据
         */
        result.setActualDataNodes("demo_ds_${0..1}.t_order_${[0, 1]}");
        result.setKeyGeneratorColumnName("order_id");
        return result;
    }

    private static TableRuleConfiguration getOrderItemTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration();

        result.setLogicTable("t_order_item");
        /**
         * 分表依据
         */
        result.setActualDataNodes("demo_ds_${0..1}.t_order_item_${[0, 1]}");
        return result;
    }
  • 运行结果:同上

4. Demo4 主从

-. 数据源配置

    @Override
    public DataSource getDataSource() throws SQLException {
        MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration();

        /**
         * 设置主从配置名称
         */
        masterSlaveRuleConfig.setName("demo_ds_master_slave");

        /**
         * 设置主数据源名称
         */
        masterSlaveRuleConfig.setMasterDataSourceName("demo_ds_master");

        /**
         * 设置从数据源名称
         */
        masterSlaveRuleConfig.setSlaveDataSourceNames(Arrays.asList("demo_ds_slave_0",
                "demo_ds_slave_1"));
        return MasterSlaveDataSourceFactory.createDataSource(createDataSourceMap(),
                masterSlaveRuleConfig, new ConcurrentHashMap<String, Object>(), new Properties());
    }

-. 分库分表配置 (不需要)

5. Demo5 主从数据库且分库分表

-. 数据源配置

    public DataSource getDataSource() throws SQLException {
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();

        /**
         * 添加分库分表规则
         */
        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
        shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");

        /**
         * 配置默认的分库策略
         */
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("user_id",
                        new PreciseModuloShardingDatabaseAlgorithm()));
        /**
         * 配置默认的分表策略
         */
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("order_id",
                        new PreciseModuloShardingTableAlgorithm()));
        /**
         * 配置主从数据库规则
         */
        shardingRuleConfig.setMasterSlaveRuleConfigs(getMasterSlaveRuleConfigurations());

        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(),
                shardingRuleConfig, new HashMap<String, Object>(), new Properties());
    }

-. 主从数据库配置

    /**
     * 设置主从数据库规则
     *
     * @return
     */
    private static List<MasterSlaveRuleConfiguration> getMasterSlaveRuleConfigurations() {

        MasterSlaveRuleConfiguration masterSlaveRuleConfig1 = new MasterSlaveRuleConfiguration();
        masterSlaveRuleConfig1.setName("ds_0");
        masterSlaveRuleConfig1.setMasterDataSourceName("demo_ds_master_0");
        masterSlaveRuleConfig1.setSlaveDataSourceNames(Arrays.asList("demo_ds_master_0_slave_0",
                "demo_ds_master_0_slave_1"));

        MasterSlaveRuleConfiguration masterSlaveRuleConfig2 = new MasterSlaveRuleConfiguration();
        masterSlaveRuleConfig2.setName("ds_1");
        masterSlaveRuleConfig2.setMasterDataSourceName("demo_ds_master_1");
        masterSlaveRuleConfig2.setSlaveDataSourceNames(Arrays.asList("demo_ds_master_1_slave_0", "demo_ds_master_1_slave_1"));

        return Lists.newArrayList(masterSlaveRuleConfig1, masterSlaveRuleConfig2);
    }

-. 分库配置 (数据源配置中已经配置)

        /**
         * 添加分表规则
         */
        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
        shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");


        /**
         * 配置默认的分表策略
         */
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("order_id",
                        new PreciseModuloShardingTableAlgorithm()));

        /**
         * 配置默认的分库策略
         */
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("user_id",
                        new PreciseModuloShardingDatabaseAlgorithm()));

-. 分表配置

    private static TableRuleConfiguration getOrderTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration();

        result.setLogicTable("t_order");

        result.setActualDataNodes("ds_${0..1}.t_order_${[0, 1]}");
        result.setKeyGeneratorColumnName("order_id");
        return result;
    }
    
    private static TableRuleConfiguration getOrderItemTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration();

        result.setLogicTable("t_order_item");
        result.setActualDataNodes("ds_${0..1}.t_order_item_${[0, 1]}");
        return result;
    }

感谢你的阅读!

相关文章

网友评论

      本文标题:3 Sharding-Sphere初体验

      本文链接:https://www.haomeiwen.com/subject/dlpvpqtx.html