ShardingSphere之讀寫(xiě)分離方式
ShardingSphere-讀寫(xiě)分離
讀寫(xiě)分離
- 依賴于 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 表操作代碼即可
讀寫(xiě)分離配置
application.yml
# 主從配置 讀寫(xiě)分離
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é)
- 完美的詮釋了 讀寫(xiě)分離
- 驗(yàn)證了 MySQL主從集群的正確性
- 新增、更新、刪除 都 操作主庫(kù) 且 同步到從庫(kù)
- 查詢 只能操作 從庫(kù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatisPlus自定義批量新增的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatisPlus自定義批量新增的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
SpringBoot啟動(dòng)參數(shù)的實(shí)現(xiàn)
SpringBoot通過(guò)jar文件方式啟動(dòng),配置可以通過(guò)啟動(dòng)參數(shù)進(jìn)行覆蓋,本文就來(lái)介紹一下SpringBoot啟動(dòng)參數(shù)的實(shí)現(xiàn),感興趣的可以了解一下2025-01-01
JPA如何使用nativequery多表關(guān)聯(lián)查詢返回自定義實(shí)體類
這篇文章主要介紹了JPA如何使用nativequery多表關(guān)聯(lián)查詢返回自定義實(shí)體類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java Eclipse中實(shí)現(xiàn)快速替換變量
這篇文章主要介紹了Java Eclipse中實(shí)現(xiàn)快速替換變量,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
PowerDesigner連接數(shù)據(jù)庫(kù)的實(shí)例詳解
這篇文章主要介紹了PowerDesigner連接數(shù)據(jù)庫(kù)的實(shí)例詳解的相關(guān)資料,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,需要的朋友可以參考下2017-10-10

