前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ShardingSphere-JDBC垂直分片

ShardingSphere-JDBC垂直分片

作者头像
鱼找水需要时间
发布2023-02-16 20:05:05
2010
发布2023-02-16 20:05:05
举报
文章被收录于专栏:SpringBoot教程

文章目录

前言

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

1、准备服务器

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

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

1.1、创建server-user容器

  • step1:创建容器:
代码语言:javascript
复制
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
  • step2:登录MySQL服务器:
代码语言:javascript
复制
#进入容器:
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';
  • step3:创建数据库:
代码语言:javascript
复制
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (
 id BIGINT AUTO_INCREMENT,
 uname VARCHAR(30),
 PRIMARY KEY (id)
);

1.2、创建server-order容器

  • step1:创建容器:
代码语言:javascript
复制
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
  • step2:登录MySQL服务器:
代码语言:javascript
复制
#进入容器:
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';
  • step3:创建数据库:
代码语言:javascript
复制
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) 
);

2、程序实现

2.1、创建实体类

代码语言:javascript
复制
@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;
}
代码语言:javascript
复制
@TableName("t_user")
@Data
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uname;
}

2.2、创建Mapper

代码语言:javascript
复制
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}
代码语言:javascript
复制
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.3、配置垂直分片

代码语言:javascript
复制
# 垂直分片
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

3、测试垂直分片

代码语言:javascript
复制
@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);
    }
}

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

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

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

查询也是一样。

常见错误

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

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

代码语言:javascript
复制
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

到此,本章内容就介绍完啦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 1、准备服务器
    • 1.1、创建server-user容器
      • 1.2、创建server-order容器
      • 2、程序实现
        • 2.1、创建实体类
          • 2.2、创建Mapper
            • 2.3、配置垂直分片
            • 3、测试垂直分片
              • 常见错误
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档