java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > ShardingSphere之读写分离

ShardingSphere之读写分离方式

作者:菜逼の世界

这篇文章主要介绍了ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

ShardingSphere-读写分离

读写分离

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

总结

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

您可能感兴趣的文章:
阅读全文