本文將為您介紹 ShardingSphere
的一些基礎(chǔ)特性和架構(gòu)組成,以及在 Springboot
環(huán)境下通過 JAVA編碼
和 Yml配置
兩種方式快速實現(xiàn)分庫分表。
一、什么是 ShardingSphere?
shardingsphere
是一款開源的分布式關(guān)系型數(shù)據(jù)庫中間件,為 Apache
的頂級項目。其前身是 sharding-jdbc
和 sharding-proxy
的兩個獨立項目,后來在 2018 年合并成了一個項目,并正式更名為 ShardingSphere。
其中 sharding-jdbc 為整個生態(tài)中最為經(jīng)典和成熟的框架,最早接觸分庫分表的人應(yīng)該都知道它,是學(xué)習(xí)分庫分表的最佳入門工具。
如今的 ShardingSphere 已經(jīng)不再是單純代指某個框架,而是一個完整的技術(shù)生態(tài)圈,由三款開源的分布式數(shù)據(jù)庫中間件 sharding-jdbc、sharding-proxy 和 sharding-sidecar 所構(gòu)成。前兩者問世較早,功能較為成熟,是目前廣泛應(yīng)用的兩個分布式數(shù)據(jù)庫中間件,因此在后續(xù)的文章中,我們將重點介紹它們的特點和使用方法。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
二、為什么選 ShardingSphere?
為了回答這個問題,我整理了市面上常見的分庫分表工具,包括 ShardingSphere
、Cobar
、Mycat
、TDDL
、MySQL Fabric
等,并從多個角度對它們進行了簡單的比較。
Cobar
Cobar 是阿里巴巴開源的一款基于MySQL的分布式數(shù)據(jù)庫中間件,提供了分庫分表、讀寫分離和事務(wù)管理等功能。它采用輪詢算法和哈希算法來進行數(shù)據(jù)分片,支持分布式分表,但是不支持單庫分多表。
它以 Proxy
方式提供服務(wù),在阿里內(nèi)部被廣泛使用已開源,配置比較容易,無需依賴其他東西,只需要有Java環(huán)境即可。兼容市面上幾乎所有的 ORM 框架,僅支持 MySQL 數(shù)據(jù)庫,且事務(wù)支持方面比較麻煩。
MyCAT
Mycat
是社區(qū)愛好者在阿里 Cobar 基礎(chǔ)上進行二次開發(fā)的,也是一款比較經(jīng)典的分庫分表工具。它以 Proxy 方式提供服務(wù),支持分庫分表、讀寫分離、SQL路由、數(shù)據(jù)分片等功能。
兼容市面上幾乎所有的 ORM 框架,包括 Hibernate、MyBatis和 JPA等都兼容,不過,美中不足的是它僅支持 MySQL數(shù)據(jù)庫,目前社區(qū)的活躍度相對較低。
TDDL
TDDL 是阿里巴巴集團開源的一款分庫分表解決方案,可以自動將SQL路由到相應(yīng)的庫表上。它采用了垂直切分和水平切分兩種方式來進行分表分庫,并且支持多數(shù)據(jù)源和讀寫分離功能。
TDDL 是基于 Java 開發(fā)的,支持 MySQL、Oracle 和 SQL Server 數(shù)據(jù)庫,并且可以與市面上 Hibernate、MyBatis等 ORM 框架集成。
不過,TDDL僅支持一些阿里巴巴內(nèi)部的工具和框架的集成,對于外部公司來說可能相對有些局限性。同時,其文檔和社區(qū)活躍度相比 ShardingSphere 來說稍顯不足。
Mysql Fabric
MySQL Fabric
是 MySQL 官方提供的一款分庫分表解決方案,同時也支持 MySQL其他功能,如高可用、負載均衡等。它采用了管理節(jié)點和代理節(jié)點的架構(gòu),其中管理節(jié)點負責(zé)實時管理分片信息,代理節(jié)點則負責(zé)接收并處理客戶端的讀寫請求。
它僅支持 MySQL 數(shù)據(jù)庫,并且可以與市面上 Hibernate、MyBatis 等 ORM 框架集成。MySQL Fabric 的文檔相對來說比較簡略,而且由于是官方提供的解決方案,其社區(qū)活躍度也相對較低。
ShardingSphere
ShardingSphere 成員中的 sharding-jdbc 以 JAR
包的形式下提供分庫分表、讀寫分離、分布式事務(wù)等功能,但僅支持 Java 應(yīng)用,在應(yīng)用擴展上存在局限性。
因此,ShardingSphere 推出了獨立的中間件 sharding-proxy,它基于 MySQL協(xié)議實現(xiàn)了透明的分片和多數(shù)據(jù)源功能,支持各種語言和框架的應(yīng)用程序使用,對接的應(yīng)用程序幾乎無需更改代碼,分庫分表配置可在代理服務(wù)中進行管理。
除了支持 MySQL,ShardingSphere還可以支持 PostgreSQL、SQLServer、Oracle等多種主流數(shù)據(jù)庫,并且可以很好地與 Hibernate、MyBatis、JPA等 ORM 框架集成。重要的是,ShardingSphere的開源社區(qū)非?;钴S。
如果在使用中出現(xiàn)問題,用戶可以在 GitHub 上提交PR并得到快速響應(yīng)和解決,這為用戶提供了足夠的安全感。
產(chǎn)品比較
通過對上述的 5 個分庫分表工具進行比較,我們不難發(fā)現(xiàn),就整體性能、功能豐富度以及社區(qū)支持等方面來看,ShardingSphere 在眾多產(chǎn)品中優(yōu)勢還是比較突出的。下邊用各個產(chǎn)品的主要指標整理了一個表格,看著更加直觀一點。
![4b684c00-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoWATZpvAARl9YeDufg239.png)
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
三、ShardingSphere 成員
ShardingSphere 的主要組成成員為sharding-jdbc
、sharding-proxy
,它們是實現(xiàn)分庫分表的兩種不同模式:
sharding-jdbc
它是一款輕量級Java框架,提供了基于 JDBC 的分庫分表功能,為客戶端直連模式。使用sharding-jdbc,開發(fā)者可以通過簡單的配置實現(xiàn)數(shù)據(jù)的分片,同時無需修改原有的SQL語句。支持多種分片策略和算法,并且可以與各種主流的ORM框架無縫集成。
![4bbc9396-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoWAPWijAADDCyq-rWo875.png)
sharding-proxy
它是基于 MySQL 協(xié)議的代理服務(wù),提供了透明的分庫分表功能。使用 sharding-proxy 開發(fā)者可以將分片邏輯從應(yīng)用程序中解耦出來,無需修改應(yīng)用代碼就能實現(xiàn)分片功能,還支持多數(shù)據(jù)源和讀寫分離等高級特性,并且可以作為獨立的服務(wù)運行。
![4be11d10-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoaAKWzGAADCGQjftD8174.png)
四、快速實現(xiàn)
我們先使用sharding-jdbc
來快速實現(xiàn)分庫分表。相比于 sharding-proxy,sharding-jdbc 適用于簡單的應(yīng)用場景,不需要額外的環(huán)境搭建等。下邊主要基于 SpringBoot 的兩種方式來實現(xiàn)分庫分表,一種是通過YML配置
方式,另一種則是通過純Java編碼
方式(不可并存 )。在后續(xù)章節(jié)中,我們會單獨詳細介紹如何使用sharding-proxy
以及其它高級特性。
ShardingSphere 官網(wǎng)地址:https://shardingsphere.apache.org/
準備工作
在開始實現(xiàn)之前,需要對數(shù)據(jù)庫和表的拆分規(guī)則進行明確。以對t_order
表進行分庫分表拆分為例,具體地,我們將 t_order 表拆分到兩個數(shù)據(jù)庫中,分別為db1
和db2
,每個數(shù)據(jù)庫又將該表拆分為三張表,分別為t_order_1
、t_order_2
和t_order_3
。
db0
├──t_order_0
├──t_order_1
└──t_order_2
db1
├──t_order_0
├──t_order_1
└──t_order_2
JAR包引入
引入必要的 JAR 包,其中最重要的是shardingsphere-jdbc-core-spring-boot-starter
和mysql-connector-java
這兩個。為了保證功能的全面性和兼容性,以及避免因低版本包導(dǎo)致的不必要錯誤和調(diào)試工作,我選擇的包版本都較高。
![4bfc66f6-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoaAGAnxAACcMQx3J28406.png)
shardingsphere-jdbc-core-spring-boot-starter 是 ShardingSphere 框架的核心組件,提供了對 JDBC 的分庫分表支持;而 mysql-connector-java 則是 MySQL JDBC 驅(qū)動程序的實現(xiàn),用于連接MySQL數(shù)據(jù)庫。除此之外,我使用了JPA
作為持久化工具還引入了相應(yīng)的依賴包。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
<version>2.7.6version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.31version>
dependency>
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starterartifactId>
<version>5.2.0version>
dependency>
YML配置
我個人是比較推薦使用YML配置方式來實現(xiàn) sharding-jdbc 分庫分表的,使用YML配置方式不僅可以讓分庫分表的實現(xiàn)更加簡單、高效、可維護,也更符合 SpringBoot的開發(fā)規(guī)范。
在 src/main/resources/application.yml 路徑文件下添加以下完整的配置,即可實現(xiàn)對t_order
表的分庫分表,接下來拆解看看每個配置模塊都做了些什么。
spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱,多數(shù)據(jù)源以逗號分隔
names:db0,db1
db0:
type:com.zaxxer.hikari.HikariDataSource
driver-class-name:com.mysql.cj.jdbc.Driver
jdbc-url:jdbc//127.0.0.1:3306/shardingsphere-db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username:root
password:123456
db1:
type:com.zaxxer.hikari.HikariDataSource
driver-class-name:com.mysql.cj.jdbc.Driver
jdbc-url:jdbc//127.0.0.1:3306/shardingsphere-db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username:root
password:123456
#分片規(guī)則配置
rules:
sharding:
#分片算法配置
sharding-algorithms:
database-inline:
#分片算法類型
type:INLINE
props:
#分片算法的行表達式(算法自行定義,此處為方便演示效果)
algorithm-expression:db$->{order_id>4?1:0}
table-inline:
#分片算法類型
type:INLINE
props:
#分片算法的行表達式
algorithm-expression:t_order_$->{order_id%4}
tables:
#邏輯表名稱
t_order:
#行表達式標識符可以使用${...}或$->{...},但前者與Spring本身的屬性文件占位符沖突,因此在Spring環(huán)境中使用行表達式標識符建議使用$->{...}
actual-data-nodes:db${0..1}.t_order_${0..3}
#分庫策略
database-strategy:
standard:
#分片列名稱
sharding-column:order_id
#分片算法名稱
sharding-algorithm-name:database-inline
#分表策略
table-strategy:
standard:
#分片列名稱
sharding-column:order_id
#分片算法名稱
sharding-algorithm-name:table-inline
#屬性配置
props:
#展示修改以后的sql語句
sql-show:true
以下是 shardingsphere
多數(shù)據(jù)源信息的配置,其中的 names
表示需要連接的數(shù)據(jù)庫別名列表,每添加一個數(shù)據(jù)庫名就需要新增一份對應(yīng)的數(shù)據(jù)庫連接配置。
spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱,多數(shù)據(jù)源以逗號分隔
names:db0,db1
db0:
type:com.zaxxer.hikari.HikariDataSource
driver-class-name:com.mysql.cj.jdbc.Driver
jdbc-url:jdbc//127.0.0.1:3306/shardingsphere-db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username:root
password:123456
db1:
type:com.zaxxer.hikari.HikariDataSource
driver-class-name:com.mysql.cj.jdbc.Driver
jdbc-url:jdbc//127.0.0.1:3306/shardingsphere-db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username:root
password:123456
rules
節(jié)點下為分片規(guī)則的配置,sharding-algorithms
節(jié)點為自定義的分片算法模塊,分片算法可以在后邊配置表的分片規(guī)則時被引用,其中:
-
database-inline
:自定義的分片算法名稱; -
type
:該分片算法的類型,這里先以 inline 為例,后續(xù)會有詳細章節(jié)介紹; -
props
:指定該分片算法的具體內(nèi)容,其中algorithm-expression
是該分片算法的表達式,即根據(jù)分片鍵值計算出要訪問的真實數(shù)據(jù)庫名或表名,。
db$->{order_id % 2}
這種為 Groovy 語言表達式,表示對分片鍵order_id
進行取模,根據(jù)取模結(jié)果計算出db0、db1,分表的表達式同理。
spring:
shardingsphere:
#規(guī)則配置
rules:
sharding:
#分片算法配置
sharding-algorithms:
database-inline:
#分片算法類型
type:INLINE
props:
#分片算法的行表達式(算法自行定義,此處為方便演示效果)
algorithm-expression:db$->{order_id%2}
table-inline:
#分片算法類型
type:INLINE
props:
#分片算法的行表達式
algorithm-expression:t_order_$->{order_id%3}
tables
節(jié)點定義了邏輯表名t_order
的分庫分表規(guī)則。actual-data-nodes
用于設(shè)置物理數(shù)據(jù)節(jié)點的數(shù)量。
db${0..1}.t_order_${0..3}
表達式意思此邏輯表在不同數(shù)據(jù)庫實例中的分布情況,如果只想單純的分庫或者分表,可以調(diào)整表達式,分庫db${0..1}
、分表t_order_${0..3}
。
db0
├──t_order_0
├──t_order_1
└──t_order_2
db1
├──t_order_0
├──t_order_1
└──t_order_2
spring:
shardingsphere:
#規(guī)則配置
rules:
sharding:
tables:
#邏輯表名稱
t_order:
#行表達式標識符可以使用${...}或$->{...},但前者與Spring本身的屬性文件占位符沖突,因此在Spring環(huán)境中使用行表達式標識符建議使用$->{...}
actual-data-nodes:db${0..1}.t_order_${0..3}
#分庫策略
database-strategy:
standard:
#分片列名稱
sharding-column:order_id
#分片算法名稱
sharding-algorithm-name:database-inline
#分表策略
table-strategy:
standard:
#分片列名稱
sharding-column:order_id
#分片算法名稱
sharding-algorithm-name:table-inline
database-strategy
和 table-strategy
分別設(shè)置了分庫和分表策略;
sharding-column
表示根據(jù)表的哪個列(分片鍵)進行計算分片路由到哪個庫、表中;
sharding-algorithm-name
表示使用哪種分片算法對分片鍵進行運算處理,這里可以引用剛才自定義的分片算法名稱使用。
props
節(jié)點用于設(shè)置其他的屬性配置,比如:sql-show
表示是否在控制臺輸出解析改造后真實執(zhí)行的 SQL語句以便進行調(diào)試。
spring:
shardingsphere:
#屬性配置
props:
#展示修改以后的sql語句
sql-show:true
跑個單測在向數(shù)據(jù)庫中插入 10 條數(shù)據(jù)時,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)相對均勻地插入到了各個分片中。
![4c282192-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoaAQgbyAAQo_RwEv4Q233.png)
JAVA 編碼
如果您不想通過 yml 配置文件實現(xiàn)自動裝配,也可以使用 ShardingSphere 的 API 實現(xiàn)相同的功能。使用 API 完成分片規(guī)則和數(shù)據(jù)源的配置,優(yōu)勢在于更加靈活、可定制性強的特點,方便進行二次開發(fā)和擴展。
下邊是純JAVA編碼方式實現(xiàn)分庫分表的完整代碼。
@Configuration
publicclassShardingConfiguration{
/**
*配置分片數(shù)據(jù)源
*/
@Bean
publicDataSourcegetShardingDataSource()throwsSQLException{
MapdataSourceMap=newHashMap<>();
dataSourceMap.put("db0",dataSource1());
dataSourceMap.put("db1",dataSource2());
//分片rules規(guī)則配置
ShardingRuleConfigurationshardingRuleConfig=newShardingRuleConfiguration();
shardingRuleConfig.setShardingAlgorithms(getShardingAlgorithms());
//配置t_order表分片規(guī)則
ShardingTableRuleConfigurationorderTableRuleConfig=newShardingTableRuleConfiguration("t_order","db${0..1}.t_order_${0..2}");
orderTableRuleConfig.setTableShardingStrategy(newStandardShardingStrategyConfiguration("order_id","table-inline"));
orderTableRuleConfig.setDatabaseShardingStrategy(newStandardShardingStrategyConfiguration("order_id","database-inline"));
shardingRuleConfig.getTables().add(orderTableRuleConfig);
//是否在控制臺輸出解析改造后真實執(zhí)行的SQL
Propertiesproperties=newProperties();
properties.setProperty("sql-show","true");
//創(chuàng)建ShardingSphere數(shù)據(jù)源
returnShardingSphereDataSourceFactory.createDataSource(dataSourceMap,Collections.singleton(shardingRuleConfig),properties);
}
/**
*配置數(shù)據(jù)源1
*/
publicDataSourcedataSource1(){
HikariDataSourcedataSource=newHikariDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc//127.0.0.1:3306/shardingsphere-db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");
dataSource.setUsername("root");
dataSource.setPassword("123456");
returndataSource;
}
/**
*配置數(shù)據(jù)源2
*/
publicDataSourcedataSource2(){
HikariDataSourcedataSource=newHikariDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc//127.0.0.1:3306/shardingsphere-db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");
dataSource.setUsername("root");
dataSource.setPassword("123456");
returndataSource;
}
/**
*配置分片算法
*/
privateMapgetShardingAlgorithms() {
MapshardingAlgorithms=newLinkedHashMap<>();
//自定義分庫算法
PropertiesdatabaseAlgorithms=newProperties();
databaseAlgorithms.setProperty("algorithm-expression","db$->{order_id%2}");
shardingAlgorithms.put("database-inline",newAlgorithmConfiguration("INLINE",databaseAlgorithms));
//自定義分表算法
PropertiestableAlgorithms=newProperties();
tableAlgorithms.setProperty("algorithm-expression","t_order_$->{order_id%3}");
shardingAlgorithms.put("table-inline",newAlgorithmConfiguration("INLINE",tableAlgorithms));
returnshardingAlgorithms;
}
}
ShardingSphere
的分片核心配置類 ShardingRuleConfiguration
,它主要用來加載分片規(guī)則、分片算法、主鍵生成規(guī)則、綁定表、廣播表等核心配置。我們將相關(guān)的配置信息 set到配置類,并通過createDataSource
創(chuàng)建并覆蓋 DataSource
,最后注入Bean。
使用Java編碼方式只是將 ShardingSphere 預(yù)知的加載配置邏輯自己手動實現(xiàn)了一遍,兩種實現(xiàn)方式比較下來,還是推薦使用YML配置方式來實現(xiàn) ShardingSphere
的分庫分表功能,相比于Java編碼,YML配置更加直觀和易于理解,開發(fā)者可以更加專注于業(yè)務(wù)邏輯的實現(xiàn),而不需要過多關(guān)注底層技術(shù)細節(jié)。
@Getter
@Setter
publicfinalclassShardingRuleConfigurationimplementsDatabaseRuleConfiguration,DistributedRuleConfiguration{
//分表配置配置
privateCollectiontables=newLinkedList<>();
//自動分片規(guī)則配置
privateCollectionautoTables=newLinkedList<>();
//綁定表配置
privateCollectionbindingTableGroups=newLinkedList<>();
//廣播表配置
privateCollectionbroadcastTables=newLinkedList<>();
//默認的分庫策略配置
privateShardingStrategyConfigurationdefaultDatabaseShardingStrategy;
//默認的分表策略配置
privateShardingStrategyConfigurationdefaultTableShardingStrategy;
//主鍵生成策略配置
privateKeyGenerateStrategyConfigurationdefaultKeyGenerateStrategy;
privateShardingAuditStrategyConfigurationdefaultAuditStrategy;
//默認的分片鍵
privateStringdefaultShardingColumn;
//自定義的分片算法
privateMapshardingAlgorithms=newLinkedHashMap<>();
//主鍵生成算法
privateMapkeyGenerators=newLinkedHashMap<>();
privateMapauditors=newLinkedHashMap<>();
}
經(jīng)過查看控制臺打印的真實 SQL日志,發(fā)現(xiàn)在使用 ShardingSphere
進行數(shù)據(jù)插入時,其內(nèi)部實現(xiàn)會先根據(jù)分片鍵 order_id
查詢記錄是否存在。如果記錄不存在,則執(zhí)行插入操作;如果記錄已存在,則進行更新操作??此浦粫?zhí)行10條插入SQL,但實際上需要執(zhí)行20條SQL語句,多少會對數(shù)據(jù)庫的性能產(chǎn)生一定的影響。
![4c45d796-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoaAUXVcAAWQROAmU7k415.png)
功能挺簡單的,但由于不同版本的 ShardingSphere 的 API 變化較大 ,網(wǎng)上類似的資料太不靠譜,本來想著借助 GPT 快點實現(xiàn)這段代碼,結(jié)果差點和它干起來,最后還是扒了扒看了源碼完成的。
![4ca745e4-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoaAXSk1AAMXlNEnuOk504.png)
默認數(shù)據(jù)源
可能有些小伙伴會有疑問,對于已經(jīng)設(shè)置了分片規(guī)則的t_order
表可以正常操作數(shù)據(jù),如果我們的t_user
表沒有配置分庫分表規(guī)則,那么在執(zhí)行插入操作時會發(fā)生什么呢?
仔細看了下官方的技術(shù)文檔,其實已經(jīng)回答了小伙伴這個問題,如果只有部分數(shù)據(jù)庫分庫分表,是否需要將不分庫分表的表也配置在分片規(guī)則中?官方回答:不需要 。
![4ceacfb2-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoeAOVdZAABlJjzzCYc882.png)
我們創(chuàng)建一張t_user
表,并且不對其進行任何分片規(guī)則的配置。在我的印象中沒有通過設(shè)置 default-data-source-name
默認的數(shù)據(jù)源,操作未分片的表應(yīng)該會報錯的!
![4d14f512-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoeAT5HzAAHQDsH3qOo685.png)
我們向t_user
嘗試插入一條數(shù)據(jù),結(jié)果居然成功了?翻了翻庫表發(fā)現(xiàn)數(shù)據(jù)只被插在了 db1 庫里,說明沒有走廣播路由。
![4d3a3e3a-43cc-11ee-a2ef-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A0/22/wKgZomTpmoeANnUnAAOhsq-NLCc290.png)
shardingsphere-jdbc 5.x版本
移除了原本的默認數(shù)據(jù)源配置,自動使用了默認數(shù)據(jù)源的規(guī)則,為驗證我多增加了數(shù)據(jù)源,嘗試性的調(diào)整了db2
、db0
、db1
的順序,再次插入數(shù)據(jù),這回記錄被插在了 db2
庫,反復(fù)試驗初步得出結(jié)論。
未分片的表默認會使用第一個數(shù)據(jù)源作為默認數(shù)據(jù)源,也就是 datasource.names
第一個。
spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱,多數(shù)據(jù)源以逗號分隔
names:db2,db1,db0
總結(jié)
本期我們對 shardingsphere 做了簡單的介紹,并使用 yml 和 Java編碼的方式快速實現(xiàn)了分庫分表功能。
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3853瀏覽量
64750 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
520瀏覽量
25564 -
MySQL
+關(guān)注
關(guān)注
1文章
831瀏覽量
26764 -
SpringBoot
+關(guān)注
關(guān)注
0文章
174瀏覽量
201
原文標題:SpringBoot 2 種方式快速實現(xiàn)分庫分表,輕松拿捏!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
數(shù)據(jù)庫分區(qū)、分庫和分表
談分布式數(shù)據(jù)庫中間件之分庫分表
你們知道為什么要分庫分表嗎
優(yōu)化MySQL數(shù)據(jù)庫中樸實無華的分表和花里胡哨的分庫
你是否知道分庫分表需要哪些要素?
SpringBoot 連接ElasticSearch的使用方式
分庫分表后復(fù)雜查詢的應(yīng)對之道:基于DTS實時性ES寬表構(gòu)建技術(shù)實踐
![<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復(fù)雜查詢的應(yīng)對之道:基于DTS實時性ES寬<b class='flag-5'>表</b>構(gòu)建技術(shù)實踐](https://file1.elecfans.com//web2/M00/F3/2C/wKgaomZ46VSARYbuAAEsDHV9EYQ944.png)
軟件系統(tǒng)數(shù)據(jù)庫的分庫分表設(shè)計
![軟件系統(tǒng)數(shù)據(jù)庫的<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設(shè)計](https://file1.elecfans.com/web2/M00/03/C2/wKgZombGsDeAbXZcAADe-3smVHg464.png)
評論