ShardingSphere之讀寫分離方式
ShardingSphere-讀寫分離
讀寫分離
- 依賴于 MySQL的主從集群 搭建手冊(cè)
- 查詢 走的是從庫(kù)(Slave)
- 新增、更新、刪除走的是主庫(kù)(Master)
MySQL主從集群
| 節(jié)點(diǎn)角色 | 主機(jī)地址 | 端口 | 用戶名 | 密碼 | 庫(kù)名 |
|---|---|---|---|---|---|
| master | 192.168.40.128 | 3306 | root | Root@123456 | db_demo |
| slave | 192.168.40.129 | 3306 | root | Root@123456 | db_demo |
創(chuàng)建 user 表
主節(jié)點(diǎn)執(zhí)行見(jiàn)表語(yǔ)句
CREATE TABLE `user` ( `id` bigint NOT NULL, `client_id` bigint NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `age` int NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

從節(jié)點(diǎn)刷新查看

項(xiàng)目代碼
復(fù)用之前的 user 表操作代碼即可
讀寫分離配置
application.yml
# 主從配置 讀寫分離
server:
port: 8081
spring:
main:
# 一個(gè)實(shí)體類對(duì)應(yīng)兩張表,覆蓋
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1,s1 # 主庫(kù) 從庫(kù)
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.40.128:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: Root@123456
s1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.40.129:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: Root@123456
sharding:
tables:
user:
# 分表策略 固定分配到主庫(kù)的user表 即 m1.user
actual-data-nodes: m1.user
# 主庫(kù)從庫(kù)規(guī)則定義
master-slave-rules:
m1:
# 主庫(kù)
master-data-source-name: m1
# 從庫(kù)
slave-data-source-names: s1
props:
# 打印SQL日志
sql:
show: true
測(cè)試結(jié)果
新增測(cè)試
- 測(cè)試類代碼
@Test
void insert() {
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i + 1);
user.setName("user_" + user.getId());
user.setClientId(10000);
user.setAge(18 + i);
userMapper.insert(user);
}
}- 運(yùn)行結(jié)果
操作的必須是主庫(kù) 對(duì)應(yīng)的數(shù)據(jù)源 m1

主庫(kù)查看

從庫(kù)查看

更新測(cè)試修改前

- 測(cè)試類代碼
修改 id=5 的記錄的 name, user_5 => Tom
@Test
void update() {
User user = new User();
user.setId(5);
user.setName("Tom");
userMapper.updateById(user);
}- 運(yùn)行結(jié)果
操作的必須是主庫(kù) 對(duì)應(yīng)的數(shù)據(jù)源 m1

查看主庫(kù)

查看從庫(kù)

刪除測(cè)試
刪除 id=5 的記錄
- 測(cè)試代碼
@Test
void delete() {
userMapper.deleteById(5);
}- 運(yùn)行結(jié)果
操作的必須是主庫(kù) 對(duì)應(yīng)的數(shù)據(jù)源
m1

查看主庫(kù)

查看從庫(kù)

查詢測(cè)試
指定ID查詢,查找id為 2、3 的記錄
- 測(cè)試代碼
@Test
void selectById() {
List<User> list = userMapper.selectList(new QueryWrapper<User>().in("id", 2, 3));
System.out.println(JSONArray.toJSONString(list));
}- 運(yùn)行結(jié)果
操作的必須是從庫(kù) 對(duì)應(yīng)的數(shù)據(jù)源 s1

總結(jié)
- 完美的詮釋了 讀寫分離
- 驗(yàn)證了 MySQL主從集群的正確性
- 新增、更新、刪除 都 操作主庫(kù) 且 同步到從庫(kù)
- 查詢 只能操作 從庫(kù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Java搭建個(gè)簡(jiǎn)單的Netty通信實(shí)例教程
這篇文章主要給大家介紹了關(guān)于如何利用Java搭建個(gè)簡(jiǎn)單的Netty通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
如何配置cursor進(jìn)行Java springboot項(xiàng)目開(kāi)發(fā)
本文介紹了如何在Cursor IDE中配置Java和Spring Boot項(xiàng)目開(kāi)發(fā)環(huán)境,首先,設(shè)置了系統(tǒng)用戶級(jí)別的JDK配置,以便在多個(gè)項(xiàng)目之間切換時(shí)不需要重新配置,然后,配置了Gradle環(huán)境變量,并安裝了必要的Java開(kāi)發(fā)插件,感興趣的朋友跟隨小編一起看看2025-02-02
springboot加載復(fù)雜的yml文件獲取不到值的解決方案
這篇文章主要介紹了springboot加載復(fù)雜的yml文件獲取不到值的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java工廠模式用法之如何動(dòng)態(tài)選擇對(duì)象詳解
工廠設(shè)計(jì)模式可能是最常用的設(shè)計(jì)模式之一,我想大家在自己的項(xiàng)目中都用到過(guò)。本文不僅僅是關(guān)于工廠模式的基本知識(shí),更是討論如何在運(yùn)行時(shí)動(dòng)態(tài)選擇不同的方法進(jìn)行執(zhí)行,你們可以看看是不是和你們項(xiàng)目中用的一樣2023-03-03
Java虛擬機(jī)JVM性能優(yōu)化(二):編譯器
這篇文章主要介紹了Java虛擬機(jī)JVM性能優(yōu)化(二):編譯器,本文先是講解了不同種類的編譯器,并對(duì)客戶端編譯,服務(wù)器端編譯器和多層編譯的運(yùn)行性能進(jìn)行了對(duì)比,然后給出了幾種常見(jiàn)的JVM優(yōu)化方法,需要的朋友可以參考下2014-09-09

