基於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.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 方式就會報錯,如果有知道的,可以告訴我下,感謝

二、配置手動指定讀寫庫

在一些場景,我們會手動的去寫庫裏進行數據查詢,那就要手動的指定寫庫

看源碼中主要是這句話判斷了數據源的讀庫或者寫庫

    private boolean isMasterRoute(SQLStatement sqlStatement) {
        return !(sqlStatement instanceof SelectStatement) || 	MasterVisitedManager.isMasterVisited() || HintManager.isMasterRouteOnly();
    }

那隻要改變 MasterVisitedManager 設置爲 masterVisited即可 MasterVisitedManager.setMasterVisited

這裏可以參考文章 SpringBoot + MyBatis + MySQL 讀寫分離實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章