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é)點刷新查看

項目代碼
復用之前的 user 表操作代碼即可
讀寫分離配置
application.yml
# 主從配置 讀寫分離
server:
port: 8081
spring:
main:
# 一個實體類對應兩張表,覆蓋
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
測試結果
新增測試
- 測試類代碼
@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);
}
}- 運行結果
操作的必須是主庫 對應的數(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);
}- 運行結果
操作的必須是主庫 對應的數(shù)據(jù)源 m1

查看主庫

查看從庫

刪除測試
刪除 id=5 的記錄
- 測試代碼
@Test
void delete() {
userMapper.deleteById(5);
}- 運行結果
操作的必須是主庫 對應的數(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));
}- 運行結果
操作的必須是從庫 對應的數(shù)據(jù)源 s1

總結
- 完美的詮釋了 讀寫分離
- 驗證了 MySQL主從集群的正確性
- 新增、更新、刪除 都 操作主庫 且 同步到從庫
- 查詢 只能操作 從庫
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類
這篇文章主要介紹了JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
PowerDesigner連接數(shù)據(jù)庫的實例詳解
這篇文章主要介紹了PowerDesigner連接數(shù)據(jù)庫的實例詳解的相關資料,如有疑問請留言或者到本站社區(qū)交流討論,需要的朋友可以參考下2017-10-10

