• ShardingSphere-JDBC垂直分片


    天道无常,常与善人

    前言

    垂直分片介绍ShardingSphere读写分离完整代码已上传Gitee

    1、准备服务器

    服务器规划:使用docker方式创建如下容器

    在这里插入图片描述

    • db服务器:容器名server-user,端口3301

    • db服务器:容器名server-order,端口3302

    1.1、创建server-user容器

    • step1:创建容器:
    docker run -d \
    -p 3301:3306 \
    -v /server/user/conf:/etc/mysql/conf.d \
    -v /server/user/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --name server-user \
    mysql:8.0.29
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • step2:登录MySQL服务器:
    #进入容器:
    docker exec -it server-user env LANG=C.UTF-8 /bin/bash
    #进入容器内的mysql命令行
    mysql -uroot -p
    #修改默认密码插件
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • step3:创建数据库:
    CREATE DATABASE db_user;
    USE db_user;
    CREATE TABLE t_user (
     id BIGINT AUTO_INCREMENT,
     uname VARCHAR(30),
     PRIMARY KEY (id)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2、创建server-order容器

    • step1:创建容器:
    docker run -d \
    -p 3302:3306 \
    -v /server/order/conf:/etc/mysql/conf.d \
    -v /server/order/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --name server-order \
    mysql:8.0.29
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • step2:登录MySQL服务器:
    #进入容器:
    docker exec -it server-order env LANG=C.UTF-8 /bin/bash
    #进入容器内的mysql命令行
    mysql -uroot -p
    #修改默认密码插件
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • step3:创建数据库:
    CREATE DATABASE db_order;
    USE db_order;
    CREATE TABLE t_order (
      id BIGINT AUTO_INCREMENT,
      order_no VARCHAR(30),
      user_id BIGINT,
      amount DECIMAL(10,2),
      PRIMARY KEY(id) 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、程序实现

    2.1、创建实体类

    @TableName("t_order")//逻辑表名
    @Data
    public class Order {
        //当没有配置shardingsphere-jdbc的分布式序列时,自动依赖数据库的主键自增策略
        @TableId(type = IdType.AUTO)
        private Long id;
        //自动映射数据库表中的order_no字段
        private String orderNo;
        //user_id
        private Long userId;
        private BigDecimal amount;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    @TableName("t_user")
    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String uname;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2、创建Mapper

    @Mapper
    public interface OrderMapper extends BaseMapper<Order> {
    }
    
    • 1
    • 2
    • 3
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
    
    • 1
    • 2
    • 3

    2.3、配置垂直分片

    # 垂直分片
    spring:
      shardingsphere:
        datasource:
          # 配置真实数据源
          names: server-order,server-user
          # 配置第 1 个数据源
          server-user:
            driver-class-name: com.mysql.jdbc.Driver
            jdbc-url: jdbc:mysql://192.168.1.1:3301/db_user
            password: 123456
            type: com.zaxxer.hikari.HikariDataSource
            username: root
          # 配置第 2 个数据源
          server-order:
            driver-class-name: com.mysql.jdbc.Driver
            jdbc-url: jdbc:mysql://192.168.1.1:3302/db_order
            password: 123456
            type: com.zaxxer.hikari.HikariDataSource
            username: root
        mode:
          # 内存模式
          type: Memory
        # 打印sql
        props:
          sql-show: true
        rules:
          # 标准分片表配置
          # 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况
          sharding:
            tables:
              t_user:
                actual-data-nodes: server-user.t_user
              t_order:
                actual-data-nodes: server-order.t_order
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3、测试垂直分片

    @RestController
    @RequestMapping("/order")
    public class OrderController {
        @Resource
        private UserMapper userMapper;
        @Resource
        private OrderMapper orderMapper;
    
        /**
         * 垂直分片:插入数据测试
         * @author: yh
         * @date: 2022/9/18
         */
        @GetMapping(value = "/add")
        public void testInsertOrderAndUser(){
            User user = new User();
            user.setUname("小明");
            userMapper.insert(user);
    
            Order order = new Order();
            order.setOrderNo("ATGUIGU001");
            order.setUserId(user.getId());
            order.setAmount(new BigDecimal(100));
            orderMapper.insert(order);
        }
    
        /**
         * 垂直分片:查询数据测试
         * @author: yh
         * @date: 2022/9/18
         */
        @GetMapping("/get")
        public void testSelectFromOrderAndUser(){
            User user = userMapper.selectById(1L);
            Order order = orderMapper.selectById(1L);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    请求http://127.0.0.1:8080/order/insert

    在这里插入图片描述

    结果:插入不同的表被路由到不同的数据源上执行

    请求http://127.0.0.1:8080/order/get

    在这里插入图片描述

    查询也是一样。

    常见错误

    在这里插入图片描述

    ShardingSphere-JDBC远程连接的方式默认的密码加密规则是:mysql_native_password

    因此需要在服务器端修改服务器的密码加密规则,如下:

    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
    • 1

    到此,本章内容就介绍完啦,如果有帮助到你 欢迎点个赞👍👍吧!!您的鼓励是博主的最大动力! 有问题评论区交流。

  • 相关阅读:
    shell学习脚本04(小滴课堂)
    java保留两位小数4种方法
    d假装d头常是可变的
    JavaWeb 请求响应路径调试
    基于 Qt UDP通信局域网通信
    [祥云杯 2022] crypto部分
    MySQL启动错误总结
    Java+Swing形成GUI图像界面
    【PAT(甲级)】1056 Mice and Rice
    【PPT】修改新建文本框默认字体
  • 原文地址:https://blog.csdn.net/weixin_43847283/article/details/126924627