SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離的示例
一、前言
本文將基于以下環(huán)境整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離
- springboot2.4.0
- mybatis-plus3.4.3.1
- mysql5.7主從
https://github.com/apache/shardingsphere
二、數(shù)據(jù)庫(kù)表準(zhǔn)備
溫馨小提示:此sql執(zhí)行時(shí),如果之前有存在相應(yīng)庫(kù)和表會(huì)進(jìn)行自動(dòng)刪除后再創(chuàng)建!
DROP DATABASE IF EXISTS ds0;
CREATE DATABASE ds0;
USE ds0;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user0
-- ----------------------------
DROP TABLE IF EXISTS `t_user0`;
CREATE TABLE `t_user0` (
`user_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶(hù)名',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密碼',
`sex` tinyint(4) NULL DEFAULT NULL COMMENT '性別',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '備注',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶(hù)' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_user1
-- ----------------------------
DROP TABLE IF EXISTS `t_user1`;
CREATE TABLE `t_user1` (
`user_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶(hù)名',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密碼',
`sex` tinyint(4) NULL DEFAULT NULL COMMENT '性別',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '備注',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶(hù)' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
-- ===============================================================================================
DROP DATABASE IF EXISTS ds1;
CREATE DATABASE ds1;
USE ds1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user0
-- ----------------------------
DROP TABLE IF EXISTS `t_user0`;
CREATE TABLE `t_user0` (
`user_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶(hù)名',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密碼',
`sex` tinyint(4) NULL DEFAULT NULL COMMENT '性別',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '備注',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶(hù)' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_user1
-- ----------------------------
DROP TABLE IF EXISTS `t_user1`;
CREATE TABLE `t_user1` (
`user_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶(hù)名',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密碼',
`sex` tinyint(4) NULL DEFAULT NULL COMMENT '性別',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '備注',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶(hù)' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

三、整合
1、pom中引入依賴(lài)
<!-- sharding-jdbc -->
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2、application.yml配置
spring:
# sharding-jdbc配置
shardingsphere:
# 是否開(kāi)啟SQL顯示
props:
sql:
show: true
# ====================== ↓↓↓↓↓↓ 數(shù)據(jù)源配置 ↓↓↓↓↓↓ ======================
datasource:
names: ds-master-0,ds-slave-0-1,ds-slave-0-2,ds-master-1,ds-slave-1-1,ds-slave-1-2
# ====================== ↓↓↓↓↓↓ 配置第1個(gè)主從庫(kù) ↓↓↓↓↓↓ ======================
# 主庫(kù)1
ds-master-0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/ds0?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
# 主庫(kù)1-從庫(kù)1
ds-slave-0-1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3307/ds0?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
# 主庫(kù)1-從庫(kù)2
ds-slave-0-2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3307/ds0?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
# ====================== ↓↓↓↓↓↓ 配置第2個(gè)主從庫(kù) ↓↓↓↓↓↓ ======================
# 主庫(kù)2
ds-master-1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/ds1?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
# 主庫(kù)2-從庫(kù)1
ds-slave-1-1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3307/ds1?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
# 主庫(kù)2-從庫(kù)2
ds-slave-1-2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3307/ds1?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否進(jìn)行SSL連接 解決則加上 &useSSL=false
username: root
password: root
sharding:
# ====================== ↓↓↓↓↓↓ 分庫(kù)分表配置 ↓↓↓↓↓↓ ======================
# 分庫(kù)策略 => 根據(jù)user_id取模拆分到不同的庫(kù)中
default-database-strategy:
inline:
sharding-column: user_id
algorithm-expression: ds-master-$->{user_id % 2}
# 分表策略
tables:
t_user:
actual-data-nodes: ds-master-$->{0..1}.t_user$->{0..1}
key-generator:
column: user_id # 主鍵ID
type: SNOWFLAKE # 生成策略
# 添加數(shù)據(jù)分表策略
table-strategy:
inline:
# 添加數(shù)據(jù)分表字段(根據(jù)字段插入數(shù)據(jù)到那個(gè)表 ex:sex)
sharding-column: sex
# 分片算法表達(dá)式 => 根據(jù)用戶(hù)性別取模拆分到不同的表中
algorithm-expression: t_user$->{sex % 2}
# ====================== ↓↓↓↓↓↓ 讀寫(xiě)分離配置 ↓↓↓↓↓↓ ======================
master-slave-rules:
ds-master-0:
# 主庫(kù)
masterDataSourceName: ds-master-0
# 從庫(kù)
slaveDataSourceNames:
- ds-slave-0-1
- ds-slave-0-2
# 從庫(kù)查詢(xún)數(shù)據(jù)的負(fù)載均衡算法 目前有2種算法 round_robin(輪詢(xún))和 random(隨機(jī))
# 算法接口 org.apache.shardingsphere.spi.masterslave.MasterSlaveLoadBalanceAlgorithm
# 實(shí)現(xiàn)類(lèi) RandomMasterSlaveLoadBalanceAlgorithm 和 RoundRobinMasterSlaveLoadBalanceAlgorithm
loadBalanceAlgorithmType: ROUND_ROBIN
ds-master-1:
masterDataSourceName: ds-master-1
slaveDataSourceNames:
- ds-slave-1-1
- ds-slave-1-2
loadBalanceAlgorithmType: ROUND_ROBIN
3、引入sharding-jdbc后數(shù)據(jù)源健康配置
解決啟動(dòng)報(bào)錯(cuò)問(wèn)題: ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid
原因: springboot2.4數(shù)據(jù)源健康檢查
@Configuration
public class DataSourceHealthConfig extends DataSourceHealthContributorAutoConfiguration {
@Value("${spring.datasource.dbcp2.validation-query:select 1}")
private String defaultQuery;
public DataSourceHealthConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
super(dataSources, metadataProviders);
}
@Override
protected AbstractHealthIndicator createIndicator(DataSource source) {
DataSourceHealthIndicator indicator = (DataSourceHealthIndicator) super.createIndicator(source);
if (!StringUtils.hasText(indicator.getQuery())) {
indicator.setQuery(defaultQuery);
}
return indicator;
}
}
到此配置完成,然后就可以自己編寫(xiě)CRUD進(jìn)行測(cè)試了,配置比較簡(jiǎn)單,屬于入門(mén)篇
四、docker-compose部署mysql主從
# 環(huán)境準(zhǔn)備 git clone https://gitee.com/zhengqingya/docker-compose.git cd docker-compose/Liunx # 運(yùn)行 docker-compose -f docker-compose-mysql-master-slave.yml -p mysql-master-slave up -d
# ================== ↓↓↓↓↓↓ 配置主庫(kù) ↓↓↓↓↓↓ ================== # 進(jìn)入主庫(kù) docker exec -it mysql_master /bin/bash # 登錄mysql mysql -uroot -proot # 創(chuàng)建用戶(hù)slave,密碼123456 CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; # 授予slave用戶(hù) `REPLICATION SLAVE`權(quán)限和`REPLICATION CLIENT`權(quán)限,用于在`主` `從` 數(shù)據(jù)庫(kù)之間同步數(shù)據(jù) GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; # 授予所有權(quán)限則執(zhí)行命令: GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'; # 使操作生效 FLUSH PRIVILEGES; # 查看狀態(tài) show master status; # 注:File和Position字段的值slave中將會(huì)用到,在slave操作完成之前不要操作master,否則將會(huì)引起狀態(tài)變化,即File和Position字段的值變化 !!! # +------------------+----------+--------------+------------------+-------------------+ # | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | # +------------------+----------+--------------+------------------+-------------------+ # | mysql-bin.000003 | 769 | | | | # +------------------+----------+--------------+------------------+-------------------+ # 1 row in set (0.00 sec) # ================== ↓↓↓↓↓↓ 配置從庫(kù) ↓↓↓↓↓↓ ================== # 進(jìn)入從庫(kù) docker exec -it mysql_slave /bin/bash # 登錄mysql mysql -uroot -proot change master to master_host='www.zhengqingya.com',master_port=3306, master_user='slave', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos= 769, master_connect_retry=30; # 開(kāi)啟主從同步過(guò)程 【停止命令:stop slave;】 start slave; # 查看主從同步狀態(tài) show slave status \G # Slave_IO_Running 和 Slave_SQL_Running 都是Yes的話,就說(shuō)明主從同步已經(jīng)配置好了! # 如果Slave_IO_Running為Connecting,SlaveSQLRunning為Yes,則說(shuō)明配置有問(wèn)題,這時(shí)候就要檢查配置中哪一步出現(xiàn)問(wèn)題了哦,可根據(jù)Last_IO_Error字段信息排錯(cuò)或谷歌… # *************************** 1. row *************************** # Slave_IO_State: Waiting for master to send event # Master_Host: www.zhengqingya.com # Master_User: slave # Master_Port: 3306 # Connect_Retry: 30 # Master_Log_File: mysql-bin.000003 # Read_Master_Log_Pos: 769 # Relay_Log_File: c598d8402b43-relay-bin.000002 # Relay_Log_Pos: 320 # Relay_Master_Log_File: mysql-bin.000003 # Slave_IO_Running: Yes # Slave_SQL_Running: Yes # Replicate_Do_DB:
五、本文案例demo源碼
https://gitee.com/zhengqingya/java-workspace
到此這篇關(guān)于SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離的示例的文章就介紹到這了,更多相關(guān)SpringBoot sharding-jdbc分庫(kù)分表與讀寫(xiě)分離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成Sharding-JDBC實(shí)現(xiàn)分庫(kù)分表方式
- SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫(kù)分表的示例代碼
- SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫(kù)分表
- SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫(kù)分表的實(shí)踐
- SpringBoot 2.0 整合sharding-jdbc中間件實(shí)現(xiàn)數(shù)據(jù)分庫(kù)分表
- SpringBoot整合sharding-jdbc 實(shí)現(xiàn)分庫(kù)分表操作的示例代碼
相關(guān)文章
Java集合基礎(chǔ)知識(shí) List/Set/Map詳解
這篇文章主要介紹了Java集合基礎(chǔ)知識(shí) List/Set/Map,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例
定長(zhǎng)隊(duì)列是一種有限容量的隊(duì)列,對(duì)于某些應(yīng)用場(chǎng)景非常有用,本文主要介紹了java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
深入解析Java編程中的StringBuffer與StringBuider
這篇文章主要介紹了Java編程中的StringBuffer與StringBuider,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
基于Properties類(lèi)操作.properties配置文件方法總結(jié)
這篇文章主要介紹了Properties類(lèi)操作.properties配置文件方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
在Ubuntu上部署SpringBoot應(yīng)用的操作步驟
隨著云計(jì)算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺(tái)之一,Java 作為一種跨平臺(tái)的編程語(yǔ)言,具有廣泛的應(yīng)用場(chǎng)景,本文將詳細(xì)介紹如何在 Ubuntu 服務(wù)器上部署 Java 應(yīng)用,需要的朋友可以參考下2025-01-01
mybatis查詢(xún)到了數(shù)據(jù),但是實(shí)體類(lèi)個(gè)別字段為null問(wèn)題
這篇文章主要介紹了mybatis查詢(xún)到了數(shù)據(jù),但是實(shí)體類(lèi)個(gè)別字段為null問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于BigDecimal類(lèi)型之間比較問(wèn)題
這篇文章主要介紹了關(guān)于BigDecimal類(lèi)型之間比較問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

