一、 分庫分表配置以及動態的讀寫分離
- 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>
- 數據源配置
/**
* 數據庫分庫分表配置
*/
@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());
}
}
- 表分片配置
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 讀寫分離實戰