springBoot? 引入maven
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
application.yml配置
spring: shardingsphere: datasource: names: db1,db2 db1: url: jdbc:mysql://localhost:3306/db1?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource db2: url: jdbc:mysql://localhost:3306/db2?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # masterslave: # # 讀寫分離配置 # load-balance-algorithm-type: round_robin #負載均衡策略,round_robin是輪循 # # 最終的數(shù)據(jù)源名稱 # name: dataSource #就是bean的名字 # # 主庫數(shù)據(jù)源名稱 # master-data-source-name: db1 # # 從庫數(shù)據(jù)源名稱列表,多個逗號分隔 # slave-data-source-names: db2 sharding: default-database-strategy: inline: sharding-column: order_id #數(shù)據(jù)庫分片策略字段 algorithm-expression: db${order_id % 2+1} # 配置t_order表分表策略 tables: t_order: actual-data-nodes: db$->{1..2}.t_order_$->{0..3} #配置t_order表分庫策略(inline-基于行表達式的分片算法) table-strategy: inline: #只適合一個字段 sharding-column: order_id #分表策略字段 algorithm-expression: t_order_$->{order_id % 2} #根據(jù)order_id%2 找到對應表名 key-generator: column: order_id type: SNOWFLAKE props: sql: show: true #打印sql
table-strategy:指定表的分片策略,table-strategy有以下幾種策略
1 ) none 表示不分片,所有數(shù)據(jù)都存儲在同一個表中。
2 ) standard 表示使用標準分片策略,根據(jù)分片鍵的值進行范圍匹配,將數(shù)據(jù)路由到對應的分片表中。
? ? ? ? 對應StandardShardingStrategy,標準分片策略,根據(jù)分片鍵的值進行范圍匹配,將數(shù)據(jù)路由到對應的分片表中,提供對SQL語句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持單分片鍵,提供PreciseShardingAlgorithm和RangeShardingAlgorithm兩個分片算法。PreciseShardingAlgorithm是必選的,用于處理=和IN的分片。RangeShardingAlgorithm是可選的,用于處理BETWEEN AND, >, <, >=, <=分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND將按照全庫路由處理。
配置standard策略,我們需要實現(xiàn)PreciseShardingAlgorithm和RangeShardingAlgorithm接口來自定義自己的分片算法,如下所示
application.yml配置
tables:
t_order:
actual-data-nodes: db$->{1..2}.t_order_$->{0..3} #配置t_order表分庫策略(inline-基于行表達式的分片算法)
table-strategy:
standard:
sharding-column: order_id
precise-algorithm-class-name: com.zjf.web.config.standard.MyTablePreciseShardingAlgorithm
分片類
@Component @Slf4j public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> { /** * @param tableNames 對應分片庫中所有分片表的集合 * @param shardingValue 為分片屬性,logicTableName 為邏輯表,columnName 分片鍵,value 為從 SQL 中解析出來的分片鍵的值 * @return */ @Override public String doSharding(Collection<String> tableNames, PreciseShardingValue<Integer> shardingValue) { for (String tableName : tableNames) { // 取模算法,分片鍵 % 表數(shù)量 String value = String.valueOf(shardingValue.getValue() % tableNames.size() ); log.info("tableName {} value============ {}",tableName,value); if (tableName.endsWith(value)) { return tableName; } } throw new IllegalArgumentException("分片失敗,tableNames:" + tableNames); } }
3 ) inline 表示使用行表達式分片策略,根據(jù)分片鍵的值通過表達式計算得到分片結(jié)果,將數(shù)據(jù)路由到對應的分片表中。
? ? ? ? ? ?對應InlineShardingStrategy,使用Groovy的表達式,提供對SQL語句中的=和IN的分片操作支持,只支持單分片鍵。對于簡單的分片算法,可以通過簡單的配置使用
tables: t_order: actual-data-nodes: db$->{1..2}.t_order_$->{0..3} table-strategy: inline: sharding-column: order_id algorithm-expression: t_order_$->{order_id % 2}
4 ) complex 表示使用復合分片策略,可以同時使用多個分片鍵對數(shù)據(jù)進行分片計算,將數(shù)據(jù)路由到對應的分片表中。
? ? ? ? 對應ComplexShardingStrategy。復合分片策略。提供對SQL語句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持,ComplexShardingStrategy支持多分片鍵,如果表是多分片鍵的,那么需要使用該策略
? ? ? ?使用complex 策略,需要我們自定義一個ComplexShardingAlgorithm實現(xiàn)類,在該實現(xiàn)類定義相關(guān)分片算法文章來源:http://www.zghlxwxcb.cn/news/detail-805648.html
@Slf4j public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm { /** * * @param availableTargetNames 進行分片的表 * @param shardingValue * @return */ @Override public Collection<String> doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) { List<String> result = new ArrayList<>(); // 獲取分片鍵列和對應的分片鍵值 Map<String, Collection<Long>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap(); // 遍歷分片鍵列和分片鍵值 for (Map.Entry<String, Collection<Long>> entry : columnNameAndShardingValuesMap.entrySet()) { String columnName = entry.getKey(); Collection<Long> shardingValues = entry.getValue(); log.info("分片鍵:"+columnName); // 根據(jù)分片鍵列和分片鍵值進行分片邏輯的實現(xiàn) for (Long shardingVal : shardingValues) { for (Object availableTargetName : availableTargetNames) { String tableName = availableTargetName.toString(); String value = String.valueOf(shardingVal % availableTargetNames.size() ); if (tableName.endsWith(value)) { result.add(tableName) ; } } } } return result; } }
?文章來源地址http://www.zghlxwxcb.cn/news/detail-805648.html
到了這里,關(guān)于ShardingSphere-JDBC 分庫分表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!