首页 > 其他分享 >springboot3.0+shardingsphere5.2 最简单的分库分表

springboot3.0+shardingsphere5.2 最简单的分库分表

时间:2024-05-25 19:11:52浏览次数:19  
标签:springboot3.0 分库 shardingsphere5.2 db sys user sharding import com

先看表结构

两个数据库test1,test2 每个库有4张sys_user表分别命名sys_user_0-4

maven依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.2.1</version>
        </dependency>
        
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

yaml配置

mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.example.domain.SysUser
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

server:
  port: 9002
spring:
  # 分库分表配置
  shardingsphere:
    datasource:
      # 默认数据源
      sharding:
        default-data-source-name: db_0
      names: db_1,db_0
      db_0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:13306/test1
        username: root
        password: 123456.ljj
      db_1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:13306/test2
        username: root
        password: 123456.ljj
    rules:
      sharding:
        tables:
          # sys_user
          sys_user:
            # 这里的db_xxx是 数据源名称,而不是实际数据库名称哦
            actual-data-nodes: db_${0..1}.sys_user_${0..3}
            # sys_user 库路由
            database-strategy:
              standard:
                sharding-column: user_id
                sharding-algorithm-name: database_inline
            # sys_user 表路由
            table-strategy:
              standard:
                sharding-column: user_id
                sharding-algorithm-name: table_inline
        sharding-algorithms:
          # sys_user库路由算法
          database_inline:
            type: INLINE
            props:
              # 有几个数据库就%多少              
              algorithm-expression: db_${user_id % 2}
          # sys_user表路由算法
          table_inline:
            type: INLINE
            props:
              # 有几张表就%多少
              algorithm-expression: sys_user_${user_id % 3}
    props:
      sql-show: true
      sql-comment-parse-enabled: true

提示

使用mybatis-plus生成以下crud各种类就行
值得注意的是,插入前设置好主键id 否则会报:java.sql.SQLException: Unknown exception: Insert statement does not support sharding table routing to multiple data nodes.
原因是可能是需要根据id分配路由到分片表吧

最后测试

POST http://localhost:9002/user
Content-Type: application/x-www-form-urlencoded

###
GET http://localhost:9002/user/2/10

###
GET http://localhost:9002/user/find/500
package com.example.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.domain.SysUser;
import com.example.mapper.SysUserMapper;
import com.example.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * description:
 * </p>
 * @date 25/05/2024
 */
@RestController
@RequestMapping("/user")
public class SysUserController {

    @Autowired
    SysUserMapper sysUserMapper;


    @PostMapping
    public void insert(SysUser sysUser) {
        SysUser build = SysUser.builder()
                .nickName("xxxx")
                .userName("xxxx")
                .password("123456")
                .email("")
                .phonenumber("123456")
                .sex("1")
                .status("0")
                .userType("1")
                .delFlag("0")
                .createBy(1L)
                .createTime(new Date())
                .updateBy(1L)
                .updateTime(new Date())
                .deptId(1L)
                .tenantId("1")
                .remark("remark")
                // 500-1000 之间的随机数
                .userId((long) (Math.random() * 500 + 500))
                .build();
        sysUserMapper.insert(build);
    }

    @GetMapping("/{size}/{page}")
    public Page<SysUser> select(@PathVariable Long page, @PathVariable Long size) {
        return sysUserMapper.selectPage(new Page<>(page, size), null);
    }

    @GetMapping("/find/{userId}")
    public SysUser find(@PathVariable Long userId) {
        return sysUserMapper.selectById(userId);
    }
}

标签:springboot3.0,分库,shardingsphere5.2,db,sys,user,sharding,import,com
From: https://www.cnblogs.com/MnysLjj/p/18212833

相关文章

  • MySQL 分库分表之后,id 主键如何处理?
    问:分库分表之后,id主键如何处理? 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持。所以这都是你实际生产环境中必须考虑的问题。 基于数据库的实现方案 数据库自增id......
  • 字节面试:百亿级存储,怎么设计?只是分库分表?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍
    10几年前,互联网产业蓬勃发展,相比传统IT企业,互联网应用每天会产生海量的数据。如何存储和分析这些数据成为了当时技术圈的痛点,彼时,分库分表解决方案应运而生。当时最流行的Java技术论坛是javaeye,有位淘宝的技术人员分享了一篇分库分表的文章,这篇文章,我反复看了几十遍,想从......
  • shardingJDBC分库分表
    背景随着项目的运行很多数据库表数据压力越来越来大,例如(订单,详情等),数据库压力越来越大,插入查询等操作异常麻烦,我们需要进行一些处理,比如根据业务水平或者垂直分库分表Cobar,阿里B2B团队开源,proxy层方案TDDL,淘宝团队,client层方案Atlas,360开源,proxy层方案Sharding-jdbc,当当......
  • 1-分库分表概述_工作过程_分片规则_目录结构_配置文件
    1.分库分表概述工作过程分片规则目录结构配置文件分库分表概述 工作过程 分片规则 目录结构 配置文件分库分表应用注意1.在数据库设计时考虑垂直分库和垂直分表2.数据量增加时,不要马上做水平分割,而是先考虑缓存处理、读写分离、使用索引等方式。如果以上方式不能解决,......
  • 分库分表
    业务介绍根据自己简历上的项目,想一个数据量较大业务(请求数多或业务累积大)。达到了什么样的量级(单表1000万或超过20G)。具体拆分策略水平分库,将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题。水平分表,解决单表存储和性能的问题。需要中间件sharding-sphe......
  • MySQL 分库分表方案,总结太全了。。
    来源:https://www.cnblogs.com/405845829qq/p/7552736.html前言公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长。之前了解过数据库的分库分表,读过几篇博文,但就只知道个模糊概念,而且现在回想起来什么都是模模糊糊的。今天......
  • 分库分表
    分库分表什么是ShardingSphereApacheShardingSphere是一款分布式的数据库生态系统。可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。详细见官网详解什么是ShardingSphere-JDBCShardingSphere-JDBC定位为轻量级Java框架,在Jav......
  • 对于开发中分库分表常用规则
    分库分表是一种数据库水平拆分的策略,常用的规则有:1.垂直分库:将不同的业务模块或者功能模块分别放在不同的数据库中,每个数据库负责处理特定的业务逻辑。这样可以降低单一数据库的负载压力,并且提高了系统的稳定性和可维护性。2.水平分表:将同一个表按照一定的规则进行拆分,将......
  • 数据库读写分离(主从复制)和分库分表详解
    数据库读写分离(主从复制)和分库分表在文章开头先抛几个问题:什么是读写分离?解决了什么问题?使用时应该注意什么?会出现什么问题?什么是主从复制?他有什么缺点?我们为什么要分库分表?什么时候才需要分库分表呢?我们的评判标准是什么?这些问题你都搞清楚了吗?相信看完这篇文章你一定......