ShardingSphere之读写分离方式

 更新时间:2025年05月28日 12:21:44   作者:菜逼の世界  
这篇文章主要介绍了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主从集群的正确性
  • 新增、更新、删除 都 操作主库 且 同步到从库
  • 查询 只能操作 从库

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatisPlus自定义批量新增的实现代码

    mybatisPlus自定义批量新增的实现代码

    这篇文章主要介绍了mybatisPlus自定义批量新增的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • jasypt SaltGenerator接口定义方法源码解读

    jasypt SaltGenerator接口定义方法源码解读

    这篇文章主要为大家介绍了jasypt SaltGenerator接口定义方法源码解读,,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot启动参数的实现

    SpringBoot启动参数的实现

    SpringBoot通过jar文件方式启动,配置可以通过启动参数进行覆盖,本文就来介绍一下SpringBoot启动参数的实现,感兴趣的可以了解一下
    2025-01-01
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java引用类型WeakReference用法及原理详解

    java引用类型WeakReference用法及原理详解

    Java弱引用(WeakReference)是一种特殊的引用类型,当垃圾回收器运行时,无论内存是否充足,只要发现对象仅被弱引用指向,就会立即回收该对象,这篇文章主要介绍了java引用类型WeakReference用法及原理的相关资料,需要的朋友可以参考下
    2026-01-01
  • SpringBoot Jpa分页查询配置方式解析

    SpringBoot Jpa分页查询配置方式解析

    这篇文章主要介绍了SpringBoot Jpa分页查询配置方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java网络编程三要素及通信程序详解

    Java网络编程三要素及通信程序详解

    这篇文章主要介绍了Java网络编程三要素及通信程序详解,Java网络编程是在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换,需要的朋友可以参考下
    2023-07-07
  • Java Eclipse中实现快速替换变量

    Java Eclipse中实现快速替换变量

    这篇文章主要介绍了Java Eclipse中实现快速替换变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • PowerDesigner连接数据库的实例详解

    PowerDesigner连接数据库的实例详解

    这篇文章主要介绍了PowerDesigner连接数据库的实例详解的相关资料,如有疑问请留言或者到本站社区交流讨论,需要的朋友可以参考下
    2017-10-10
  • SpringMVC适配器模式作用范围介绍

    SpringMVC适配器模式作用范围介绍

    适配器这个词我们应该很熟悉,天天都在使用,手机充电时,电源线头头就叫电源适配器,干什么用的呢?把220V电压转换成手机充电时使用的电压,那么适配器是不是很好理解了,下面看一下
    2023-04-04

最新评论