在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot 2種方式快速實(shí)現(xiàn)分庫(kù)分表,輕松拿捏!

jf_ro2CN3Fa ? 來(lái)源:程序員小富 ? 2023-08-26 14:22 ? 次閱讀


本文將為您介紹 ShardingSphere 的一些基礎(chǔ)特性和架構(gòu)組成,以及在 Springboot 環(huán)境下通過(guò) JAVA編碼Yml配置 兩種方式快速實(shí)現(xiàn)分庫(kù)分表。

一、什么是 ShardingSphere?

shardingsphere 是一款開(kāi)源的分布式關(guān)系型數(shù)據(jù)庫(kù)中間件,為 Apache 的頂級(jí)項(xiàng)目。其前身是 sharding-jdbcsharding-proxy 的兩個(gè)獨(dú)立項(xiàng)目,后來(lái)在 2018 年合并成了一個(gè)項(xiàng)目,并正式更名為 ShardingSphere。

其中 sharding-jdbc 為整個(gè)生態(tài)中最為經(jīng)典和成熟的框架,最早接觸分庫(kù)分表的人應(yīng)該都知道它,是學(xué)習(xí)分庫(kù)分表的最佳入門(mén)工具。

如今的 ShardingSphere 已經(jīng)不再是單純代指某個(gè)框架,而是一個(gè)完整的技術(shù)生態(tài)圈,由三款開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件 sharding-jdbc、sharding-proxy 和 sharding-sidecar 所構(gòu)成。前兩者問(wèn)世較早,功能較為成熟,是目前廣泛應(yīng)用的兩個(gè)分布式數(shù)據(jù)庫(kù)中間件,因此在后續(xù)的文章中,我們將重點(diǎn)介紹它們的特點(diǎn)和使用方法。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

二、為什么選 ShardingSphere?

為了回答這個(gè)問(wèn)題,我整理了市面上常見(jiàn)的分庫(kù)分表工具,包括 ShardingSphere、Cobar、Mycat、TDDLMySQL Fabric 等,并從多個(gè)角度對(duì)它們進(jìn)行了簡(jiǎn)單的比較。

Cobar

Cobar 是阿里巴巴開(kāi)源的一款基于MySQL的分布式數(shù)據(jù)庫(kù)中間件,提供了分庫(kù)分表、讀寫(xiě)分離和事務(wù)管理等功能。它采用輪詢(xún)算法和哈希算法來(lái)進(jìn)行數(shù)據(jù)分片,支持分布式分表,但是不支持單庫(kù)分多表。

它以 Proxy 方式提供服務(wù),在阿里內(nèi)部被廣泛使用已開(kāi)源,配置比較容易,無(wú)需依賴(lài)其他東西,只需要有Java環(huán)境即可。兼容市面上幾乎所有的 ORM 框架,僅支持 MySQL 數(shù)據(jù)庫(kù),且事務(wù)支持方面比較麻煩。

MyCAT

Mycat 是社區(qū)愛(ài)好者在阿里 Cobar 基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)的,也是一款比較經(jīng)典的分庫(kù)分表工具。它以 Proxy 方式提供服務(wù),支持分庫(kù)分表、讀寫(xiě)分離、SQL路由、數(shù)據(jù)分片等功能。

兼容市面上幾乎所有的 ORM 框架,包括 Hibernate、MyBatis和 JPA等都兼容,不過(guò),美中不足的是它僅支持 MySQL數(shù)據(jù)庫(kù),目前社區(qū)的活躍度相對(duì)較低。

TDDL

TDDL 是阿里巴巴集團(tuán)開(kāi)源的一款分庫(kù)分表解決方案,可以自動(dòng)將SQL路由到相應(yīng)的庫(kù)表上。它采用了垂直切分和水平切分兩種方式來(lái)進(jìn)行分表分庫(kù),并且支持多數(shù)據(jù)源和讀寫(xiě)分離功能。

TDDL 是基于 Java 開(kāi)發(fā)的,支持 MySQL、Oracle 和 SQL Server 數(shù)據(jù)庫(kù),并且可以與市面上 Hibernate、MyBatis等 ORM 框架集成。

不過(guò),TDDL僅支持一些阿里巴巴內(nèi)部的工具和框架的集成,對(duì)于外部公司來(lái)說(shuō)可能相對(duì)有些局限性。同時(shí),其文檔和社區(qū)活躍度相比 ShardingSphere 來(lái)說(shuō)稍顯不足。

Mysql Fabric

MySQL Fabric是 MySQL 官方提供的一款分庫(kù)分表解決方案,同時(shí)也支持 MySQL其他功能,如高可用、負(fù)載均衡等。它采用了管理節(jié)點(diǎn)和代理節(jié)點(diǎn)的架構(gòu),其中管理節(jié)點(diǎn)負(fù)責(zé)實(shí)時(shí)管理分片信息,代理節(jié)點(diǎn)則負(fù)責(zé)接收并處理客戶(hù)端的讀寫(xiě)請(qǐng)求。

它僅支持 MySQL 數(shù)據(jù)庫(kù),并且可以與市面上 Hibernate、MyBatis 等 ORM 框架集成。MySQL Fabric 的文檔相對(duì)來(lái)說(shuō)比較簡(jiǎn)略,而且由于是官方提供的解決方案,其社區(qū)活躍度也相對(duì)較低。

ShardingSphere

ShardingSphere 成員中的 sharding-jdbc 以 JAR 包的形式下提供分庫(kù)分表、讀寫(xiě)分離、分布式事務(wù)等功能,但僅支持 Java 應(yīng)用,在應(yīng)用擴(kuò)展上存在局限性。

因此,ShardingSphere 推出了獨(dú)立的中間件 sharding-proxy,它基于 MySQL協(xié)議實(shí)現(xiàn)了透明的分片和多數(shù)據(jù)源功能,支持各種語(yǔ)言和框架的應(yīng)用程序使用,對(duì)接的應(yīng)用程序幾乎無(wú)需更改代碼,分庫(kù)分表配置可在代理服務(wù)中進(jìn)行管理。

除了支持 MySQL,ShardingSphere還可以支持 PostgreSQL、SQLServer、Oracle等多種主流數(shù)據(jù)庫(kù),并且可以很好地與 Hibernate、MyBatis、JPA等 ORM 框架集成。重要的是,ShardingSphere的開(kāi)源社區(qū)非?;钴S。

如果在使用中出現(xiàn)問(wèn)題,用戶(hù)可以在 GitHub 上提交PR并得到快速響應(yīng)和解決,這為用戶(hù)提供了足夠的安全感。

產(chǎn)品比較

通過(guò)對(duì)上述的 5 個(gè)分庫(kù)分表工具進(jìn)行比較,我們不難發(fā)現(xiàn),就整體性能、功能豐富度以及社區(qū)支持等方面來(lái)看,ShardingSphere 在眾多產(chǎn)品中優(yōu)勢(shì)還是比較突出的。下邊用各個(gè)產(chǎn)品的主要指標(biāo)整理了一個(gè)表格,看著更加直觀一點(diǎn)。

4b684c00-43cc-11ee-a2ef-92fbcf53809c.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

三、ShardingSphere 成員

ShardingSphere 的主要組成成員為sharding-jdbc、sharding-proxy,它們是實(shí)現(xiàn)分庫(kù)分表的兩種不同模式:

sharding-jdbc

它是一款輕量級(jí)Java框架,提供了基于 JDBC 的分庫(kù)分表功能,為客戶(hù)端直連模式。使用sharding-jdbc,開(kāi)發(fā)者可以通過(guò)簡(jiǎn)單的配置實(shí)現(xiàn)數(shù)據(jù)的分片,同時(shí)無(wú)需修改原有的SQL語(yǔ)句。支持多種分片策略和算法,并且可以與各種主流的ORM框架無(wú)縫集成。

4bbc9396-43cc-11ee-a2ef-92fbcf53809c.png

sharding-proxy

它是基于 MySQL 協(xié)議的代理服務(wù),提供了透明的分庫(kù)分表功能。使用 sharding-proxy 開(kāi)發(fā)者可以將分片邏輯從應(yīng)用程序中解耦出來(lái),無(wú)需修改應(yīng)用代碼就能實(shí)現(xiàn)分片功能,還支持多數(shù)據(jù)源和讀寫(xiě)分離等高級(jí)特性,并且可以作為獨(dú)立的服務(wù)運(yùn)行。

4be11d10-43cc-11ee-a2ef-92fbcf53809c.png

四、快速實(shí)現(xiàn)

我們先使用sharding-jdbc來(lái)快速實(shí)現(xiàn)分庫(kù)分表。相比于 sharding-proxy,sharding-jdbc 適用于簡(jiǎn)單的應(yīng)用場(chǎng)景,不需要額外的環(huán)境搭建等。下邊主要基于 SpringBoot 的兩種方式來(lái)實(shí)現(xiàn)分庫(kù)分表,一種是通過(guò)YML配置方式,另一種則是通過(guò)純Java編碼方式(不可并存 )。在后續(xù)章節(jié)中,我們會(huì)單獨(dú)詳細(xì)介紹如何使用sharding-proxy以及其它高級(jí)特性。

ShardingSphere 官網(wǎng)地址:https://shardingsphere.apache.org/

準(zhǔn)備工作

在開(kāi)始實(shí)現(xiàn)之前,需要對(duì)數(shù)據(jù)庫(kù)和表的拆分規(guī)則進(jìn)行明確。以對(duì)t_order表進(jìn)行分庫(kù)分表拆分為例,具體地,我們將 t_order 表拆分到兩個(gè)數(shù)據(jù)庫(kù)中,分別為db1db2,每個(gè)數(shù)據(jù)庫(kù)又將該表拆分為三張表,分別為t_order_1、t_order_2t_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-startermysql-connector-java這兩個(gè)。為了保證功能的全面性和兼容性,以及避免因低版本包導(dǎo)致的不必要錯(cuò)誤和調(diào)試工作,我選擇的包版本都較高。

4bfc66f6-43cc-11ee-a2ef-92fbcf53809c.png

shardingsphere-jdbc-core-spring-boot-starter 是 ShardingSphere 框架的核心組件,提供了對(duì) JDBC 的分庫(kù)分表支持;而 mysql-connector-java 則是 MySQL JDBC 驅(qū)動(dòng)程序的實(shí)現(xiàn),用于連接MySQL數(shù)據(jù)庫(kù)。除此之外,我使用了JPA作為持久化工具還引入了相應(yīng)的依賴(lài)包。


<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配置

我個(gè)人是比較推薦使用YML配置方式來(lái)實(shí)現(xiàn) sharding-jdbc 分庫(kù)分表的,使用YML配置方式不僅可以讓分庫(kù)分表的實(shí)現(xiàn)更加簡(jiǎn)單、高效、可維護(hù),也更符合 SpringBoot的開(kāi)發(fā)規(guī)范。

在 src/main/resources/application.yml 路徑文件下添加以下完整的配置,即可實(shí)現(xiàn)對(duì)t_order表的分庫(kù)分表,接下來(lái)拆解看看每個(gè)配置模塊都做了些什么。

spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱(chēng),多數(shù)據(jù)源以逗號(hào)分隔
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:
#分片算法類(lèi)型
type:INLINE
props:
#分片算法的行表達(dá)式(算法自行定義,此處為方便演示效果)
algorithm-expression:db$->{order_id>4?1:0}
table-inline:
#分片算法類(lèi)型
type:INLINE
props:
#分片算法的行表達(dá)式
algorithm-expression:t_order_$->{order_id%4}
tables:
#邏輯表名稱(chēng)
t_order:
#行表達(dá)式標(biāo)識(shí)符可以使用${...}或$->{...},但前者與Spring本身的屬性文件占位符沖突,因此在Spring環(huán)境中使用行表達(dá)式標(biāo)識(shí)符建議使用$->{...}
actual-data-nodes:db${0..1}.t_order_${0..3}
#分庫(kù)策略
database-strategy:
standard:
#分片列名稱(chēng)
sharding-column:order_id
#分片算法名稱(chēng)
sharding-algorithm-name:database-inline
#分表策略
table-strategy:
standard:
#分片列名稱(chēng)
sharding-column:order_id
#分片算法名稱(chēng)
sharding-algorithm-name:table-inline
#屬性配置
props:
#展示修改以后的sql語(yǔ)句
sql-show:true

以下是 shardingsphere 多數(shù)據(jù)源信息的配置,其中的 names 表示需要連接的數(shù)據(jù)庫(kù)別名列表,每添加一個(gè)數(shù)據(jù)庫(kù)名就需要新增一份對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接配置。

spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱(chēng),多數(shù)據(jù)源以逗號(hào)分隔
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é)點(diǎn)下為分片規(guī)則的配置,sharding-algorithms 節(jié)點(diǎn)為自定義的分片算法模塊,分片算法可以在后邊配置表的分片規(guī)則時(shí)被引用,其中:

  • database-inline:自定義的分片算法名稱(chēng);
  • type:該分片算法的類(lèi)型,這里先以 inline 為例,后續(xù)會(huì)有詳細(xì)章節(jié)介紹;
  • props:指定該分片算法的具體內(nèi)容,其中 algorithm-expression 是該分片算法的表達(dá)式,即根據(jù)分片鍵值計(jì)算出要訪(fǎng)問(wèn)的真實(shí)數(shù)據(jù)庫(kù)名或表名,。

db$->{order_id % 2} 這種為 Groovy 語(yǔ)言表達(dá)式,表示對(duì)分片鍵 order_id 進(jìn)行取模,根據(jù)取模結(jié)果計(jì)算出db0、db1,分表的表達(dá)式同理。

spring:
shardingsphere:
#規(guī)則配置
rules:
sharding:
#分片算法配置
sharding-algorithms:
database-inline:
#分片算法類(lèi)型
type:INLINE
props:
#分片算法的行表達(dá)式(算法自行定義,此處為方便演示效果)
algorithm-expression:db$->{order_id%2}
table-inline:
#分片算法類(lèi)型
type:INLINE
props:
#分片算法的行表達(dá)式
algorithm-expression:t_order_$->{order_id%3}

tables節(jié)點(diǎn)定義了邏輯表名t_order的分庫(kù)分表規(guī)則。actual-data-nodes 用于設(shè)置物理數(shù)據(jù)節(jié)點(diǎn)的數(shù)量。

db${0..1}.t_order_${0..3} 表達(dá)式意思此邏輯表在不同數(shù)據(jù)庫(kù)實(shí)例中的分布情況,如果只想單純的分庫(kù)或者分表,可以調(diào)整表達(dá)式,分庫(kù)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:
#邏輯表名稱(chēng)
t_order:
#行表達(dá)式標(biāo)識(shí)符可以使用${...}或$->{...},但前者與Spring本身的屬性文件占位符沖突,因此在Spring環(huán)境中使用行表達(dá)式標(biāo)識(shí)符建議使用$->{...}
actual-data-nodes:db${0..1}.t_order_${0..3}
#分庫(kù)策略
database-strategy:
standard:
#分片列名稱(chēng)
sharding-column:order_id
#分片算法名稱(chēng)
sharding-algorithm-name:database-inline
#分表策略
table-strategy:
standard:
#分片列名稱(chēng)
sharding-column:order_id
#分片算法名稱(chēng)
sharding-algorithm-name:table-inline

database-strategytable-strategy分別設(shè)置了分庫(kù)和分表策略;

sharding-column表示根據(jù)表的哪個(gè)列(分片鍵)進(jìn)行計(jì)算分片路由到哪個(gè)庫(kù)、表中;

sharding-algorithm-name 表示使用哪種分片算法對(duì)分片鍵進(jìn)行運(yùn)算處理,這里可以引用剛才自定義的分片算法名稱(chēng)使用。

props節(jié)點(diǎn)用于設(shè)置其他的屬性配置,比如:sql-show表示是否在控制臺(tái)輸出解析改造后真實(shí)執(zhí)行的 SQL語(yǔ)句以便進(jìn)行調(diào)試。

spring:
shardingsphere:
#屬性配置
props:
#展示修改以后的sql語(yǔ)句
sql-show:true

跑個(gè)單測(cè)在向數(shù)據(jù)庫(kù)中插入 10 條數(shù)據(jù)時(shí),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)相對(duì)均勻地插入到了各個(gè)分片中。

4c282192-43cc-11ee-a2ef-92fbcf53809c.png

JAVA 編碼

如果您不想通過(guò) yml 配置文件實(shí)現(xiàn)自動(dòng)裝配,也可以使用 ShardingSphere 的 API 實(shí)現(xiàn)相同的功能。使用 API 完成分片規(guī)則和數(shù)據(jù)源的配置,優(yōu)勢(shì)在于更加靈活、可定制性強(qiáng)的特點(diǎn),方便進(jìn)行二次開(kāi)發(fā)和擴(kuò)展。

下邊是純JAVA編碼方式實(shí)現(xiàn)分庫(kù)分表的完整代碼。

@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);

//是否在控制臺(tái)輸出解析改造后真實(shí)執(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<>();

//自定義分庫(kù)算法
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 的分片核心配置類(lèi) ShardingRuleConfiguration,它主要用來(lái)加載分片規(guī)則、分片算法、主鍵生成規(guī)則、綁定表、廣播表等核心配置。我們將相關(guān)的配置信息 set到配置類(lèi),并通過(guò)createDataSource創(chuàng)建并覆蓋 DataSource,最后注入Bean。

使用Java編碼方式只是將 ShardingSphere 預(yù)知的加載配置邏輯自己手動(dòng)實(shí)現(xiàn)了一遍,兩種實(shí)現(xiàn)方式比較下來(lái),還是推薦使用YML配置方式來(lái)實(shí)現(xiàn) ShardingSphere的分庫(kù)分表功能,相比于Java編碼,YML配置更加直觀和易于理解,開(kāi)發(fā)者可以更加專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不需要過(guò)多關(guān)注底層技術(shù)細(xì)節(jié)。

@Getter
@Setter
publicfinalclassShardingRuleConfigurationimplementsDatabaseRuleConfiguration,DistributedRuleConfiguration{

//分表配置配置
privateCollectiontables=newLinkedList<>();
//自動(dòng)分片規(guī)則配置
privateCollectionautoTables=newLinkedList<>();
//綁定表配置
privateCollectionbindingTableGroups=newLinkedList<>();
//廣播表配置
privateCollectionbroadcastTables=newLinkedList<>();
//默認(rèn)的分庫(kù)策略配置
privateShardingStrategyConfigurationdefaultDatabaseShardingStrategy;
//默認(rèn)的分表策略配置
privateShardingStrategyConfigurationdefaultTableShardingStrategy;
//主鍵生成策略配置
privateKeyGenerateStrategyConfigurationdefaultKeyGenerateStrategy;

privateShardingAuditStrategyConfigurationdefaultAuditStrategy;
//默認(rèn)的分片鍵
privateStringdefaultShardingColumn;
//自定義的分片算法
privateMapshardingAlgorithms=newLinkedHashMap<>();
//主鍵生成算法
privateMapkeyGenerators=newLinkedHashMap<>();

privateMapauditors=newLinkedHashMap<>();
}

經(jīng)過(guò)查看控制臺(tái)打印的真實(shí) SQL日志,發(fā)現(xiàn)在使用 ShardingSphere 進(jìn)行數(shù)據(jù)插入時(shí),其內(nèi)部實(shí)現(xiàn)會(huì)先根據(jù)分片鍵 order_id 查詢(xún)記錄是否存在。如果記錄不存在,則執(zhí)行插入操作;如果記錄已存在,則進(jìn)行更新操作??此浦粫?huì)執(zhí)行10條插入SQL,但實(shí)際上需要執(zhí)行20條SQL語(yǔ)句,多少會(huì)對(duì)數(shù)據(jù)庫(kù)的性能產(chǎn)生一定的影響。

4c45d796-43cc-11ee-a2ef-92fbcf53809c.png

功能挺簡(jiǎn)單的,但由于不同版本的 ShardingSphere 的 API 變化較大 ,網(wǎng)上類(lèi)似的資料太不靠譜,本來(lái)想著借助 GPT 快點(diǎn)實(shí)現(xiàn)這段代碼,結(jié)果差點(diǎn)和它干起來(lái),最后還是扒了扒看了源碼完成的。

4ca745e4-43cc-11ee-a2ef-92fbcf53809c.png

默認(rèn)數(shù)據(jù)源

可能有些小伙伴會(huì)有疑問(wèn),對(duì)于已經(jīng)設(shè)置了分片規(guī)則的t_order表可以正常操作數(shù)據(jù),如果我們的t_user表沒(méi)有配置分庫(kù)分表規(guī)則,那么在執(zhí)行插入操作時(shí)會(huì)發(fā)生什么呢?

仔細(xì)看了下官方的技術(shù)文檔,其實(shí)已經(jīng)回答了小伙伴這個(gè)問(wèn)題,如果只有部分?jǐn)?shù)據(jù)庫(kù)分庫(kù)分表,是否需要將不分庫(kù)分表的表也配置在分片規(guī)則中?官方回答:不需要

4ceacfb2-43cc-11ee-a2ef-92fbcf53809c.png

我們創(chuàng)建一張t_user表,并且不對(duì)其進(jìn)行任何分片規(guī)則的配置。在我的印象中沒(méi)有通過(guò)設(shè)置 default-data-source-name 默認(rèn)的數(shù)據(jù)源,操作未分片的表應(yīng)該會(huì)報(bào)錯(cuò)的!

4d14f512-43cc-11ee-a2ef-92fbcf53809c.png

我們向t_user嘗試插入一條數(shù)據(jù),結(jié)果居然成功了?翻了翻庫(kù)表發(fā)現(xiàn)數(shù)據(jù)只被插在了 db1 庫(kù)里,說(shuō)明沒(méi)有走廣播路由。

4d3a3e3a-43cc-11ee-a2ef-92fbcf53809c.png

shardingsphere-jdbc 5.x版本移除了原本的默認(rèn)數(shù)據(jù)源配置,自動(dòng)使用了默認(rèn)數(shù)據(jù)源的規(guī)則,為驗(yàn)證我多增加了數(shù)據(jù)源,嘗試性的調(diào)整了db2、db0、db1的順序,再次插入數(shù)據(jù),這回記錄被插在了 db2 庫(kù),反復(fù)試驗(yàn)初步得出結(jié)論。

未分片的表默認(rèn)會(huì)使用第一個(gè)數(shù)據(jù)源作為默認(rèn)數(shù)據(jù)源,也就是 datasource.names 第一個(gè)。

spring:
shardingsphere:
#數(shù)據(jù)源配置
datasource:
#數(shù)據(jù)源名稱(chēng),多數(shù)據(jù)源以逗號(hào)分隔
names:db2,db1,db0

總結(jié)

本期我們對(duì) shardingsphere 做了簡(jiǎn)單的介紹,并使用 yml 和 Java編碼的方式快速實(shí)現(xiàn)了分庫(kù)分表功能。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3853

    瀏覽量

    64759
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    520

    瀏覽量

    25568
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    831

    瀏覽量

    26765
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    174

    瀏覽量

    201

原文標(biāo)題:SpringBoot 2 種方式快速實(shí)現(xiàn)分庫(kù)分表,輕松拿捏!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫(kù)分區(qū)、分庫(kù)

    今天先說(shuō)說(shuō)數(shù)據(jù)庫(kù)的數(shù)據(jù)分區(qū),分庫(kù)以及的內(nèi)容吧! 數(shù)據(jù)庫(kù)分區(qū)、分庫(kù) 數(shù)據(jù)庫(kù)分區(qū)、
    的頭像 發(fā)表于 09-30 11:24 ?2937次閱讀

    談分布式數(shù)據(jù)庫(kù)中間件之分庫(kù)   

    及如何進(jìn)行分片兩方面對(duì)DDM分庫(kù)做一個(gè)闡釋?!   ∈裁词菙?shù)據(jù)分片    分片是解決數(shù)據(jù)庫(kù)存儲(chǔ)容量限制的直接途徑。分片包括垂直分片與水平分片兩
    發(fā)表于 08-02 20:19

    基于SpringBoot mybatis方式的增刪改查實(shí)現(xiàn)

    SpringBoot mybatis方式實(shí)現(xiàn)增刪改查
    發(fā)表于 06-18 16:56

    分庫(kù)是什么?怎么實(shí)現(xiàn)?

    數(shù)據(jù)庫(kù)分庫(kù)、讀寫(xiě)分離的原理實(shí)現(xiàn),使用場(chǎng)景
    發(fā)表于 10-25 17:24

    利用Mycat實(shí)現(xiàn)MySQL讀寫(xiě)分離、分庫(kù)最佳實(shí)踐

    利用Mycat實(shí)現(xiàn)MySQL讀寫(xiě)分離、分庫(kù)最佳實(shí)踐
    發(fā)表于 09-08 10:20 ?14次下載
    利用Mycat<b class='flag-5'>實(shí)現(xiàn)</b>MySQL讀寫(xiě)分離、<b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>最佳實(shí)踐

    數(shù)據(jù)庫(kù)分庫(kù)基礎(chǔ)和實(shí)踐

    訪(fǎng)問(wèn),實(shí)現(xiàn)了讀寫(xiě)分離和分庫(kù)。?  圖1:典型的讀寫(xiě)分離和分庫(kù)
    發(fā)表于 09-05 16:40 ?270次閱讀

    你們知道為什么要分庫(kù)

    在文章開(kāi)頭先拋幾個(gè)問(wèn)題: (1)什么時(shí)候才需要分庫(kù)呢?我們的評(píng)判標(biāo)準(zhǔn)是什么? (2)一張存儲(chǔ)了多少數(shù)據(jù)的時(shí)候,才需要考慮
    的頭像 發(fā)表于 08-16 10:37 ?1575次閱讀

    優(yōu)化MySQL數(shù)據(jù)庫(kù)中樸實(shí)無(wú)華的和花里胡哨的分庫(kù)

    blog.csdn.net/qq_39390545/article/details/116248222 一、樸實(shí)無(wú)華的 - 1、垂直 2
    的頭像 發(fā)表于 08-26 16:33 ?1297次閱讀

    你是否知道分庫(kù)需要哪些要素?

    分庫(kù)會(huì)重新影響數(shù)據(jù)的分布,無(wú)論是全量還是增量,都會(huì)涉及到數(shù)據(jù)遷移,所以Databus是必要的。
    的頭像 發(fā)表于 10-12 10:39 ?833次閱讀

    什么是分庫(kù)?為什么分庫(kù)?什么情況下會(huì)用分庫(kù)呢?

    分庫(kù)是由分庫(kù)這兩個(gè)獨(dú)立概念組成的,只不過(guò)通常分庫(kù)
    的頭像 發(fā)表于 11-30 09:37 ?7627次閱讀

    分庫(kù)的21條法則速來(lái)碼?。ㄉ希?/a>

    分庫(kù)技術(shù)來(lái)處理這個(gè)問(wèn)題。具體而言,我們將原本的單庫(kù)分成了兩個(gè)庫(kù),分別為`DB_1`和`DB_2`,并在每個(gè)庫(kù)中再次進(jìn)行
    的頭像 發(fā)表于 05-26 17:33 ?603次閱讀
    <b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來(lái)碼?。ㄉ希? />    </a>
</div>                            <div   id=

    分庫(kù)的21條法則速來(lái)碼?。ㄏ拢?/a>

    分庫(kù)技術(shù)來(lái)處理這個(gè)問(wèn)題。具體而言,我們將原本的單庫(kù)分成了兩個(gè)庫(kù),分別為`DB_1`和`DB_2`,并在每個(gè)庫(kù)中再次進(jìn)行
    的頭像 發(fā)表于 05-26 17:33 ?683次閱讀
    <b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來(lái)碼?。ㄏ拢? />    </a>
</div>                            <div   id=

    SpringBoot 連接ElasticSearch的使用方式

    方式有以下四方式 方式一:通過(guò) Elastic Transport Client 客戶(hù)端連接 es 服務(wù)器,底層基于 TCP 協(xié)議通過(guò) transport 模塊和遠(yuǎn)程 ES 服務(wù)端
    的頭像 發(fā)表于 10-09 10:35 ?1235次閱讀

    分庫(kù)后復(fù)雜查詢(xún)的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬構(gòu)建技術(shù)實(shí)踐

    1 問(wèn)題域 業(yè)務(wù)發(fā)展的初期,我們的數(shù)據(jù)庫(kù)架構(gòu)往往是單庫(kù)單,外加讀寫(xiě)分離來(lái)快速的支撐業(yè)務(wù),隨著用戶(hù)量和訂單量的增加,數(shù)據(jù)庫(kù)的計(jì)算和存儲(chǔ)往往會(huì)成為我們系統(tǒng)的瓶頸,業(yè)界的實(shí)踐多數(shù)采用分而治之的思想:分庫(kù)
    的頭像 發(fā)表于 06-25 18:30 ?917次閱讀
    <b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復(fù)雜查詢(xún)的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬<b class='flag-5'>表</b>構(gòu)建技術(shù)實(shí)踐

    軟件系統(tǒng)數(shù)據(jù)庫(kù)的分庫(kù)設(shè)計(jì)

    軟件系統(tǒng)數(shù)據(jù)庫(kù)的分庫(kù)設(shè)計(jì) 系統(tǒng)讀寫(xiě)分離、分庫(kù)技術(shù)實(shí)現(xiàn)
    的頭像 發(fā)表于 08-22 11:39 ?376次閱讀
    軟件系統(tǒng)數(shù)據(jù)庫(kù)的<b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設(shè)計(jì)
    主站蜘蛛池模板: 91久久福利国产成人精品 | 高颜值大长腿美女啪啪 | 夜色资源站www国产在线观看 | 成年人毛片网站 | 亚洲 图片 小说 欧美 另类 | 欧美潘金莲一级风流片a级 欧美片欧美日韩国产综合片 | 国产精品美女一区二区三区 | 狠狠色丁香婷婷综合欧美 | 黄视频网站观看 | 国产理论 | 一区二区三区视频免费观看 | 国产福利午夜 | 日日爽夜夜 | 国产高清成人mv在线观看 | 2017天天天天做夜夜夜做 | 免费看污黄视频软件 | 久久国产免费观看 | 手机免费在线视频 | 超h 高h 污肉男男 | 午夜在线观看免费观看大全 | 四虎影视4hu4虎成人 | 国产精品久线观看视频 | 免费精品99久久国产综合精品 | 亚洲综合一区二区三区 | 亚州黄色网址 | 国产码一区二区三区 | 黄色大片网站 | 国产日本久久久久久久久婷婷 | 午夜三级视频 | 国产看色免费 | 成人午夜大片免费7777 | 午夜精品久久久久久毛片 | 国产成人精品日本亚洲直接 | www.激情.com| 人人爽人人澡 | 色婷婷一区二区三区四区成人网 | 日本骚视频 | 波多野结衣在线观看一区二区三区 | 国产一级特黄 | 天天干天天干天天干天天干天天干 | av大片|