ShardingSphere之讀寫分離方式
ShardingSphere-讀寫分離
讀寫分離
- 依賴于 MySQL的主從集群 搭建手冊
- 查詢 走的是從庫(Slave)
- 新增、更新、刪除走的是主庫(Master)
MySQL主從集群
| 節(jié)點角色 | 主機地址 | 端口 | 用戶名 | 密碼 | 庫名 |
|---|---|---|---|---|---|
| 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é)點執(zhí)行見表語句
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é)點刷新查看

項目代碼
復(fù)用之前的 user 表操作代碼即可
讀寫分離配置
application.yml
# 主從配置 讀寫分離
server:
port: 8081
spring:
main:
# 一個實體類對應(yīng)兩張表,覆蓋
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1,s1 # 主庫 從庫
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:
# 分表策略 固定分配到主庫的user表 即 m1.user
actual-data-nodes: m1.user
# 主庫從庫規(guī)則定義
master-slave-rules:
m1:
# 主庫
master-data-source-name: m1
# 從庫
slave-data-source-names: s1
props:
# 打印SQL日志
sql:
show: true
測試結(jié)果
新增測試
- 測試類代碼
@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);
}
}- 運行結(jié)果
操作的必須是主庫 對應(yīng)的數(shù)據(jù)源 m1

主庫查看

從庫查看

更新測試修改前

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

查看主庫

查看從庫

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

查看主庫

查看從庫

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

總結(jié)
- 完美的詮釋了 讀寫分離
- 驗證了 MySQL主從集群的正確性
- 新增、更新、刪除 都 操作主庫 且 同步到從庫
- 查詢 只能操作 從庫
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何配置cursor進行Java springboot項目開發(fā)
本文介紹了如何在Cursor IDE中配置Java和Spring Boot項目開發(fā)環(huán)境,首先,設(shè)置了系統(tǒng)用戶級別的JDK配置,以便在多個項目之間切換時不需要重新配置,然后,配置了Gradle環(huán)境變量,并安裝了必要的Java開發(fā)插件,感興趣的朋友跟隨小編一起看看2025-02-02
springboot加載復(fù)雜的yml文件獲取不到值的解決方案
這篇文章主要介紹了springboot加載復(fù)雜的yml文件獲取不到值的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

