ShardingSphere-读写分离

ShardingSphere-读写分离

读写分离

  • 依赖于 MySQL的主从集群 搭建手册
  • 查询 走的是从库(Slave)
  • 新增、更新、删除走的是主库(Master)

MySQL主从集群

节点角色主机地址端口用户名密码库名
master192.168.40.1283306rootRoot@123456db_demo
slave192.168.40.1293306rootRoot@123456db_demo

创建 user

主节点执行见表语句

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;

在这里插入图片描述

从节点刷新查看

在这里插入图片描述

项目代码

复用之前的 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
      # 主库从库规则定义
      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);
     }
 }
  • 运行结果

操作的必须是主库 对应的数据源 m1
在这里插入图片描述

  • 主库查看

在这里插入图片描述

  • 从库查看

在这里插入图片描述

更新测试

  • 修改前

在这里插入图片描述

  • 测试类代码

修改 id=5 的记录的 name, user_5 => Tom

@Test
 void update() {
     User user = new User();
     user.setId(5);
     user.setName("Tom");
     userMapper.updateById(user);
 }
  • 运行结果

操作的必须是主库 对应的数据源 m1

在这里插入图片描述

  • 查看主库

在这里插入图片描述

  • 查看从库

在这里插入图片描述

删除测试

删除 id=5 的记录

  • 测试代码
@Test
void delete() {
    userMapper.deleteById(5);
}
  • 运行结果

操作的必须是主库 对应的数据源 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));
}
  • 运行结果

操作的必须是从库 对应的数据源 s1

在这里插入图片描述

总结

  • 完美的诠释了 读写分离
  • 验证了 MySQL主从集群的正确性
  • 新增更新删除操作主库同步到从库
  • 查询 只能操作 从库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜逼の世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值