基于shardjdbc的读写分离以及数据分片配置

一、 分库分表配置以及动态的读写分离
  1. pom.xml 增加 shardjdbc支持
  	<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-core -->
	<dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-core</artifactId>
        <version>4.0.0-RC2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.4</version>
    </dependency>
  1. 数据源配置

/**
 * 数据库分库分表配置
 */
@Configuration
public class ShardJdbcConfig {

    @Bean
    @ConfigurationProperties("datasource.c3p0.write")
    public DataSource writeDataSource(){
        return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
    }

    @Bean
    @ConfigurationProperties("datasource.c3p0.read")
    public DataSource readDataSource(){
        return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
    }


    /**
     * C3P0-0.9.1.2, shardingjdbc-3.1.0
     * Shard-JDBC 分库配置
     */
    @Bean
    @DependsOn({"writeDataSource", "readDataSource"})
    @Primary
    public DataSource dataSource(DataSource writeDataSource, DataSource readDataSource) throws SQLException {

        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        shardingRuleConfig.getTableRuleConfigs().add(TableShardConfigs.financeOrdTbRule());

        shardingRuleConfig.setDefaultDataSourceName("ds_write");

        /*数据源读写分离*/
        shardingRuleConfig.getMasterSlaveRuleConfigs()
                .add(new MasterSlaveRuleConfiguration("ds_0", "ds_write", Arrays.asList("ds_read")));

        Map<String,DataSource> dataSourceMap = new HashMap<>();
        dataSourceMap.put("ds_write", writeDataSource);
        dataSourceMap.put("ds_read", readDataSource);


        return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
    }
}
  1. 表分片配置
public class TableShardConfigs {

    public static TableRuleConfiguration financeOrdTbRule() {

        TableRuleConfiguration configuration =
                new TableRuleConfiguration("t_user", "ds_0.t_user_${0..7}");

        configuration.setTableShardingStrategyConfig(
                new StandardShardingStrategyConfiguration("user_id", (PreciseShardingAlgorithm<Long>) (collection, value) -> {
                    return "t_user_" + (value.getValue() % 8);
                })
        );

        return configuration;
    }


}

以上配置可满足基本的分库分表配置以及动态的读写分离了,但是不知为何,我这边使用InlineShardingStrategyConfiguration 方式就会报错,如果有知道的,可以告诉我下,感谢

二、配置手动指定读写库

在一些场景,我们会手动的去写库里进行数据查询,那就要手动的指定写库

看源码中主要是这句话判断了数据源的读库或者写库

	//org.apache.shardingsphere.core.route.router.masterslave.ShardingMasterSlaveRouter#isMasterRoute
    private boolean isMasterRoute(SQLStatement sqlStatement) {
        return !(sqlStatement instanceof SelectStatement) || 	MasterVisitedManager.isMasterVisited() || HintManager.isMasterRouteOnly();
    }

那只要改变 MasterVisitedManager 设置为 masterVisited即可 MasterVisitedManager.setMasterVisited

这里可以参考文章 SpringBoot + MyBatis + MySQL 读写分离实战

三、小结

根据以上代码可以看出,shardingjdbc的读写分离是主备方案的,满足 以下条件之一则走主库,否则走从库集合,通过一定的LB策略来选择其中一个从库进行操作

  • 非 Select 语句
  • 存在主库访问
  • HintManager.getInstance().setMasterRouteOnly();方式指定只走主库

shardingjdbc的方案是除非手动指定主库,或者进行的是非读操作,否则走的是从库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值