Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring boot+sharding jdbc实现分库分表

spring boot+sharding jdbc实现分库分表

原创
作者头像
shigen
发布于 2023-12-03 04:18:09
发布于 2023-12-03 04:18:09
5790
举报

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

😅😅最近几天的状态有点不对,所以有几天没有更新了。

当我们的数据量比较大(没接触过)就会考虑一下分库分表的策略。当然分库分表又分为多种策略:

  • 拆分数据库,做到数据的分离(多租户的设计
  • 水平拆分表:类似于数据的分片
  • 垂直拆分表:某些不常用的字段放在另外一张表,我们通过主键关联,在之前的文章mysql表设计规范中也有提到:
一张表的字段不要过多
一张表的字段不要过多

在去年疫情的时候,其实shigen就研究了一下这个,只不过当时用的是apache-shardingsphere,采用的是官方的资源包,需要各种安装和配置:

apache-shardingsphere
apache-shardingsphere

最近发现它其实可以和springboot结合起来使用,于是研究了一下,最后发现很好用。

官方配置文档在这里,需要详细步骤的可以去看下官网的案例和解释。

首先我们创建两个数据库,每个数据库两张表:

代码语言:sql
AI代码解释
复制
-- 数据库1中的user表
CREATE TABLE ds0.user0
(
    id   INT PRIMARY KEY COMMENT '用户ID',
    name VARCHAR(50) COMMENT '用户姓名',
    age  INT COMMENT '用户年龄'
);

CREATE TABLE ds0.user1
(
    id   INT PRIMARY KEY COMMENT '用户ID',
    name VARCHAR(50) COMMENT '用户姓名',
    age  INT COMMENT '用户年龄'
);

-- 数据库2中的user表
CREATE TABLE ds1.user0
(
    id   INT PRIMARY KEY COMMENT '用户ID',
    name VARCHAR(50) COMMENT '用户姓名',
    age  INT COMMENT '用户年龄'
);

CREATE TABLE ds1.user1
(
    id   INT PRIMARY KEY COMMENT '用户ID',
    name VARCHAR(50) COMMENT '用户姓名',
    age  INT COMMENT '用户年龄'
);

对应关系是这样的:

数据库

数据表

备注

Ds0

User0

数据源1的分表1

Ds0

User1

数据源1的分表2

Ds1

User0

数据源2的分表1

Ds1

User1

数据源2的分表2

shigen之前创建的数据库和数据表用到了类似这样的名字:

demo-ds-0user_1,发现配置起来老有问题了,直接炸了啊。

踩坑记录
踩坑记录

最后改成不要下划线的才算正常。

在一切准备好之后,我们开始今天的案例。

基于sharding-jdbc实现数据水平切分

引入依赖
代码语言:html
AI代码解释
复制
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

这是最核心的依赖,当然,mysql的驱动、mybatis-plus这里也是需要的。

生成基础代码

我们用魔法生成对应的controllerservicedao

生成代码
生成代码
编写配置文件

这里我就直接贴上我的配置了,更多的配置可以参考官网。

代码语言:yaml
AI代码解释
复制
spring:
  shardingsphere:
    datasource:
      names: ds0, ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ds0
        username: root
        password: 123456
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ds1
        username: root
        password: 123456

    sharding:
      tables:
        user:
          actual-data-nodes: ds$->{0..1}.user$->{0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: user$->{id % 2}
          key-generator:
            column: id
            type: SNOWFLAKE
      binding-tables: user
      broadcast-tables:
      default-database-strategy:
        inline:
          sharding-column: age
          algorithm-expression: ds$->{age % 2}

    props:
        sql:
          show: true
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

其实看起来也很有意思的:

  • 采用了druid作为数据库的连接池工具,它自带后台,可以监控我们的sql
  • 我们表的拆分根据的是user.id,id是偶数就放在user0,奇放在user1
  • 数据库的拆分根据的是user.age,这里的age是偶数,放在ds0,反之放在ds1
  • 打印详细的sql执行语句

就这些,其实已经帮我们把复杂的配置简单了。现在,我们写一个测试类测试吧。

测试类测试
代码语言:java
AI代码解释
复制
    @Test
    public void saveTest() {
        for (int i = 100; i < 120; i++) {
            User user = new User().setId(i+10000).setName("shigen-" + i).setAge(RandomUtil.randomInt(5, 100));
            userMapper.insert(user);
        }
    }

1-99的我已经测试了。

观察一下运行的结果:

查看到的实际的sql
查看到的实际的sql

我们再到数据库看一下:

实际的数据
实际的数据

很符合预期啊,年龄为奇数的在ds0,id为偶数的在user0;表明我们的测试顺利。

其实还是那句话,具体场景具体的分析,没有这么大的数据量,分库分表反而是复杂、完全没必要的设计。也希望提供一种技术选型和参考。

当然,sharding-jdbc还支持读写分离,正好shigen之前也有一个文章是关于springboot+mybtais-plus实现读写分离的,那就期待下期的文章吧!


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台

账号

链接

CSDN

shigen01

知乎

gen-2019

掘金

shigen01

腾讯云开发者社区

shigen

微信公众平台

shigen

公众号名:shigen

shigen一起,每天不一样!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 2.x ShardingSphere分库分表实战
在之前我做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的开源框架,最常见的就是mycat,sharding-sphere,最终我选择后者,用它来做分库分表比较容易上手。
java架构师
2019/06/05
1.3K0
SpringBoot 2.x ShardingSphere分库分表实战
超详细sharding-jdbc分库分表实现(基于spring-boot)
demo 地址:https://github.com/FleyX/demo-project/tree/master/spring-boot/sjdemo 部分内容参考 ShardingSphere 官方文档:官方文档
小森啦啦啦
2019/07/15
9.9K0
超详细sharding-jdbc分库分表实现(基于spring-boot)
1.Sharding-JDBC 分库分表实战
AI码师
2023/09/11
2780
1.Sharding-JDBC 分库分表实战
springboot实战之mysql分库分表
把存于一个库的数据分散到多个库中,把存于一个表的数据分散到多个表中。如果说读写分离是为了分散数据库读写操作压力,分库分表就是为了分散存储压力
lyb-geek
2019/10/28
7K0
SpringBoot 2.x ShardingSphere分库分表实战
在之前我做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的开源框架,最常见的就是mycat,sharding-sphere,最终我选择后者,用它来做分库分表比较容易上手。
小东啊
2019/06/26
1.7K0
SpringBoot 2.x ShardingSphere分库分表实战
ShardingSphere解决海量数据分库分表
互联网高速发展,同时也带来的海量数据存储问题。传统关系型数据库的单库单表已经很难支撑,如何高效存储和访问这些数据,成为业内急需解决的问题。解决思路有两个方向:
微观技术
2021/04/19
8540
ShardingSphere解决海量数据分库分表
Sharding-Jdbc 实现读写分离、分库分表
ShardingSphere-Jdbc 定位为轻量级Java框架,在Java的Jdbc层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,可理解为增强版的Jdbc驱动,完全兼容Jdbc和各种ORM框架
民工哥
2021/07/16
8250
Sharding-Jdbc 实现读写分离、分库分表
SpringBoot 整合sharding jdbc实现分库分表
这里为了方便,我在接口中添加了参数,可以指定活动id,因为我们的库和表都是 activity_id % 2得到,所以通过设置奇偶数,判断分片策略是否生效
AI码师
2022/09/19
9460
SpringBoot 整合sharding jdbc实现分库分表
ShardingSphere实现分库分表
  Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
程序员云帆哥
2022/05/12
1.3K0
ShardingSphere实现分库分表
【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。
水平分片又称为横向拆分。它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入0库(或表),奇数主键的记录放入1库(或表),如下图所示。
哈__
2024/04/08
1.9K0
【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。
sharding-jdbc分库连接数优化
Tech 导读 本文以降低sharding-jdbc数据库连接数实践为主线,探究了sharding-jdbc的路由规则,对比分析了四种改造方案,给出了一种自定义分表算法的优化方案。
京东技术
2023/09/11
5190
sharding-jdbc分库连接数优化
ShardingJdbc分库分表实战案例解析(上)
在对诸如订单、交易、支付等实时在线业务系统的研发、维护过程中,随着业务量的快速增长,我们经常会遇到由于关系型数据库(如:MySql)单表数据量增长过大而引发的线上事故;虽然这些事故多数时候是由于不合理的慢SQL而引起的系统雪崩,但有时也会出现由于数据库热点块IO争用而引发的系统性性能下降。总之,单表数据量的无限增长总是会在这样或那样的情况下增加系统的不稳定性因素。
用户5927304
2020/08/13
1.7K0
ShardingJdbc分库分表实战案例解析(上)
数据量大了一定要分表,分库分表Sharding-JDBC入门与项目实战
最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题。因此想借助一些分库分表的中间件,实现自动化分库分表实现。调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分库分表的客户端组件。
程序员白楠楠
2020/12/10
1.9K0
分库分表之第五篇
电商平台商品列表展示,每个列表项中除了包含商品基本信息、商品描述信息之外,还包括了商品所属的店铺信息,如下 :
海仔
2020/02/11
6480
Springboot2.x + ShardingSphere 实现分库分表
之前一篇文章中我们讲了基于Mysql8的读写分离(文后有链接),这次来说说分库分表的实现过程。
JAVA日知录
2019/10/19
1K0
聊聊 Sharding-JDBC 分库分表
这是《ShardingSphere 进阶》专栏的第一篇文章,介绍一下Sharding-JDBC实现分库分表的详细配置。
码猿技术专栏
2023/05/01
1.6K0
聊聊 Sharding-JDBC 分库分表
spring boot+sharding jdbc实现读写分离
在shigen之前的文章中,写到了Springboot +mybatis plus实现读写分离,没有sharding-jdbc的夹持,真的是举步维艰啊。在接触这个神器之后,发现之前的代码很难改了,于是就在前一篇文章spring boot+sharding jdbc实现分库分表的基础上再次的修改。基础的配置这里不再展开了,需要的话可以参考之前的文章。
shigen
2023/12/06
2740
spring boot+sharding jdbc实现读写分离
Sharding垂直分库分表最终篇
之前的几篇文章,阿粉已经说了这个SpringBoot整合 Sharding-JDBC 实现了水平的分库分表,也是我们在日常的业务中最经常用到的,把数据进行水平分库,比如按照日期分库,按照奇偶性用户ID来水平分库,今天阿粉来说说如何使用 Sharding-JDBC 进行垂直切分表和数据库。
Java极客技术
2022/12/04
7060
Sharding垂直分库分表最终篇
Sharding-JDBC:垂直拆分怎么做?
经过读写分离的优化后,小王可算是轻松了一段时间,读写分离具体的方案请查看这篇文章:Sharding-JDBC:查询量大如何优化?
猿天地
2019/06/19
7730
Sharding-JDBC:垂直拆分怎么做?
SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践
在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量。当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术。
赛先生和泰先生
2022/03/01
1.4K0
SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践
推荐阅读
相关推荐
SpringBoot 2.x ShardingSphere分库分表实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档