SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。

这篇具有很好参考价值的文章主要介绍了SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

👩🏽‍💻个人主页:阿木木AEcru

🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》

💹每一次技术突破,都是对自我能力的挑战和超越。

Docker部署MYSQL主从详细教程-阿木木AEcru-CSDN

那天写了 部署mysql主从后,想了想,还是有必要出多一篇关于ShardingSphere-JDBC 读写分离、分库分表的文章,做就得做全套,那么今天就来实现一下。

一、前言

首先我们得知道读写分离以及分库分表的基本概念。

1.1 读写分离是什么?

读写分离其核心思想是将数据库的读操作(查询)和写操作(插入、更新、删除)分离到不同的数据库服务器上。这样做是为了提高数据库系统的处理能力和伸缩性,同时减轻单个数据库服务器的负载。

这就是为什么需要主库和从库的原因了,大部分的写操作都是在 主库进行操作的,而从库则承担了读操作,如果说需要更加的高可用的话,可以部署多出多从的架构。将读写操作分担导了不同的节点,更有利于服务的稳定性。不会说某一台的负载特别高。

1.2 分库分表是什么?

分库就是根据根据业务耦合性将一个库中的多张表拆分出来独立到另外一个库。例如在微服务结构中就需要分库,因为一个服务就需要一个库,而分库的粒度也是取决于你服务的粒度。

分表有两种分表的方式,垂直分表以及水平分表。

垂直分表:是将一个表中的一部分字段抽离出来做一个冗余的表,当一个表的字段非常多,且某些字段的访问频率较低或字段较大时,这时就非常适合使用垂直分表,将访问频率大的字段、或者较大(存储字符较多) 的字段抽离出来独立一张表。这样单张表的数据量就不会太大,从而提高查询效率

水平分表:当单表行数非常大,导致查询和更新操作变慢时,这时就适合使用水平分表, 将表的数据按照某种规则(如用户ID、时间等)分散到多个表中,每个表包含完整的表结构,但是数据是分散的。 这样单张表的行数就不会太大,一般单张表建议是在500w行左右。

总的来说,其实分表就是为了使得单张表的数据量不会过大而影响查询效率,当然最佳优化肯定还是需要优化查询SQL以及索引等方式来进行调优。

好了,了解了什么是读写分离以及分库分表后,就进入了今天的主题了,我们接着往下看。

二、ShardingSphere-JDBC 实现 读写分离

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。ShardingSphere官网

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

2.1 读写分离逻辑

读写分离则是根据 SQL 语义的分析,将读操作和写操作分别路由至主库与从库。需要注意的是,shardingSphere 不会帮你实现数据库的主从同步,这个就需要你自己去配置数据库了,文章开头也有mysql配置主从的教程链接,感兴趣的小伙伴可以去看看。

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

与ShardingSphere-proxy对比

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

这里简单讲讲ShardingSphere-proxy,它实际上是再请求到实际的数据库之前做了一层代理,请求先到了ShardingSphere-proxy 上,然后通过一系列的算法将sql分散在不同的数据库节点。这样的好处也就是不用每个服务都独立配置,只需要配置这一层代理就行了。坏处就是需要独立占用服务器的资源,处理请求的瓶颈也会转移到它这里。 这就有点像 Mycat了,感兴趣的小伙伴可以去了解一下。

2.2 实现读写分离

下面我将会通过一个demo来演示。主要代码我会在后面的贴出来。需要源码的可以私信博主。

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

这是demo的项目结构。

2.3 pom文件

<dependencies>
        <!--SpringBoot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--Shardingjdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core</artifactId>
            <version>5.3.2</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.9</version>
        </dependency>

        <!--mysql 驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <!--mybatis plus extension,包含了mybatis plus core-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.5.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- hutool工具类-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-crypto</artifactId>
            <version>5.8.10</version>
        </dependency>

        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.33</version>
        </dependency>
    </dependencies>

2.4 application.yml 配置文件

# 服务配置
server:
  # 应用程序运行的端口
  port: 9001
  # Servlet的上下文路径
  servlet:
    context-path: /sharding-jdbc

# 日志配置
logging:
  # 设置特定包(通常是应用程序包)的日志级别
  level:
    # 设置com.example.demo包下的类的日志级别为debug
    com.example.demo: debug
    # 设置com.example.demo.repository包下的类的日志级别为trace(更详细)
    com.example.demo.repository: trace

# Spring框架配置
spring:
  # 数据源配置
  datasource:
    # 驱动类名,这里使用的是ShardingSphere提供的驱动
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    # 数据源URL,使用ShardingSphere的JDBC URL格式
    url: jdbc:shardingsphere:classpath:sharding-jdbc.yml
    # 这里指定了ShardingSphere的配置文件位置,该文件包含了分片规则等配置

  # JPA(Java Persistence API)配置
  jpa:
    # 是否显示执行的SQL语句
    show-sql: true
    # JPA属性配置
    properties:
      # Hibernate的配置属性
      hibernate:
        # 自动更新数据库表结构
        ddl.auto: update
        # 打印执行时间统计信息
        generate_statistics: true
      # 指定数据库方言,这里使用的是MySQL 5的InnoDB方言
      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    # 是否在视图(View)中打开查询
    open-in-view: false

2.5 (重点)sharding-jdbc.yml 配置文件


# 数据源配置
dataSources:
  # 主数据库配置
  master1:
    # 数据源类名,这里使用的是阿里巴巴的Druid连接池
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    # JDBC驱动类名
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据库连接URL,包括数据库地址、端口、数据库名以及连接参数
    url: jdbc:mysql://121.36.95.63:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true&autoReconnect=true&serverTimezone=GMT%2B8
    # 数据库登录用户名
    username: root
    # 数据库登录密码
    password: root
  # 从数据库1配置
  slave1:
    # 数据源类名,与主数据库相同
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    # JDBC驱动类名,与主数据库相同
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据库连接URL,与主数据库类似,但端口不同
    url: jdbc:mysql://121.36.95.63:3307/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true&autoReconnect=true&serverTimezone=GMT%2B8
    # 数据库登录用户名,与主数据库相同
    username: root
    # 数据库登录密码,与主数据库相同
    password: root

# 规则配置
rules:
  # 声明使用读写分离规则
  - !READWRITE_SPLITTING
    # 读写分离的数据源配置
    dataSources:
      readwrite_ds:
        # 静态策略配置
        staticStrategy:
          # 写操作指向的主数据源名称
          writeDataSourceName: master1
          # 读操作指向的从数据源名称列表
          readDataSourceNames:
            - slave1
        # 负载均衡器名称
      loadBalancerName: round_robin
    # 负载均衡器配置
    loadBalancers:
      # 轮询负载均衡器
      round_robin:
        # 负载均衡器类型为轮询
        type: ROUND_ROBIN

# 属性配置
props:
  # 是否显示执行的SQL语句
  sql-show: true

2.6 Controller测试接口

其他代码我这边就不贴了,重点是上面配置文件,如果有 需要源码的小伙伴,可以私信我。

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping("/list")
    public R getList(){
        return R.ok(userService.list());
    }

    @PostMapping("/save")
    public R save(){
        User user = new User();
        user.setName("小明"+String.format("%06d",RandomUtils.nextInt(0,1000000)));
        user.setAddress("广州");
        user.setAge(RandomUtils.nextInt(18,100));
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        return R.ok(userService.save(user));
    }
}

2.7 请求测试结果

调用查询接口

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

调用写入接口

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

三、ShardingSphere-Jdbc 实现 数据分片(分库分表)

3.1 (重点)sharding-jdbc.yml 配置文件

# 数据源配置
dataSources:
  # 主数据库配置
  master1:
    # 数据源类名,这里使用的是阿里巴巴的Druid连接池
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    # JDBC驱动类名
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据库连接URL,包括数据库地址、端口、数据库名以及连接参数
    url: jdbc:mysql://121.36.95.63:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true&autoReconnect=true&serverTimezone=GMT%2B8
    # 数据库登录用户名
    username: root
    # 数据库登录密码
    password: root

# 分片规则配置
rules:
  # 读写分离配置
  - !READWRITE_SPLITTING
    # 定义读写分离的数据源
    dataSources:
      readwrite_ds:
        # 静态策略,定义写操作指向的数据源和读操作指向的数据源列表
        staticStrategy:
          writeDataSourceName: master1  # 写操作指向的主数据源名称
          readDataSourceNames:  # 读操作指向的从数据源名称列表
            - slave1
        # 负载均衡器名称
      loadBalancerName: round_robin
    # 定义负载均衡器的类型和策略
    loadBalancers:
      round_robin:
        type: ROUND_ROBIN  # 轮询负载均衡策略

  # 分表路由配置
  - !SHARDING
    # 定义需要分片的表及其分片策略
    tables:
      sys_log:
        # 定义实际的数据节点,包括数据源名称和表名
        actualDataNodes: master1.sys_log_$->{0..2}
        # 定义表的分片策略
        tableStrategy:
          standard:
            # 分片键和分片算法名称
            shardingColumn: id
            shardingAlgorithmName: t-log-inline
        # 定义键生成策略
        keyGenerateStrategy:
          column: id  # 指定键生成策略的列名
          keyGeneratorName: snowflake  # 指定使用的键生成器名称 这里使用的雪花算法


    # 定义分片算法
    shardingAlgorithms:
      t-log-inline:
        # 分片算法类型
        type: INLINE
        # 分片算法的属性配置
        props:
          algorithm-expression: sys_log_$->{id % 3}  # 分片算法表达式,根据id字段的值进行取模运算

    # 定义键生成器
    keyGenerators:
      snowflake:
        # 键生成器类型
        type: SNOWFLAKE

# 其他属性配置
props:
  sql-show: true  # 是否显示执行的SQL语句,便于调试

3.2 Controller 测试接口

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

3.3 写操作请求测试结果

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

这里通过 id 字段进行取模,有几张表就取模多少就行。这里使用的是最基础的分表策略,ShardingSphere-Jdbc 还支持 数据库分片,通过不同的规则计算 来进行 不同数据库的读写操作, 因为我这里 实现了读写分离,就不好做 数据库分片了, 不然数据库的数据会不一致。 感兴趣的小伙伴可以一起再评论区交流一下。 ShardingSphere-Jdbc 也还支持 各种分表策略,也可以自定义分表策略,常见的有,按照时间范围(年月日) , 按照 数据 哈希运算取模 、按照 业务字段 等。

3.4 读操作请求测试结果

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

这里由于没有用id字段查询,所以没有路由到对应的表来查,就会所有表都查询然后汇总结果。

spring-jdbc5.3.25本地仓库,spring boot,后端,java,数据库,mysql

当指定了id(分表路由字段)作为条件之后,就可以精准的路由到某张表查询,这样查询效率就会快很多。

四、结尾

感谢您的观看! 如果本文对您有帮助,麻烦用您发财的小手点个三连吧!您的支持就是作者前进的最大动力!再次感谢!文章来源地址https://www.toymoban.com/news/detail-849563.html

到了这里,关于SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ShardingSphere-JDBC-若依框架集成

    ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架(SpringBoot)前后端版本、动态数据源,可自行切换,默认数据源为达梦8 官网文档地址:https://shardingsphere.apache.org/document/current/cn/overview/ 简介 开源的分布式数据库中间件解决方案组成的生态圈 关系

    2024年02月09日
    浏览(82)
  • Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月26日
    浏览(48)
  • 分表?分库?分库分表?实践详谈 ShardingSphere-JDBC

    如果有不是很了解ShardingSphere的可以先看一下这个文章: 《ShardingSphere JDBC?Sharding JDBC?》基本小白脱坑问题         在很多开发场景下面,很多的技术难题都是出自于,大数据量级或者并发的场景下面的。这里就出现了我们要解决的。本文章重点讨论一下在java的spirng开发场

    2024年04月12日
    浏览(38)
  • 一、Sharding-JDBC系列01:整合SpringBoot实现分库分表,读写分离

    目录 一、概述 二、案例演示-水平分表 (1)、创建springboot工程 (2)、创建数据库和数据表 (3)、application.yaml配置分片规则   (4)、测试数据插入、查询操作 4.1、插入-控制台SQL日志  4.2、查询-控制台SQL日志  三、案例演示-水平分库 (1)、创建数据库和数据表  (2)、application.yaml配置

    2024年02月02日
    浏览(45)
  • 0101读写分离测试-jdbc-shardingsphere-中间件

    shardingshpere-jdbc定位为轻量级 Java 框架, 在 Java 的 JDBC 层提供的额外服务 。 它使用客户端直连数据库, 以 jar 包形式提供服务 ,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。 关于mysql配置主从复制,可以参考之前写的文章= 0101docker mysq

    2024年02月11日
    浏览(46)
  • SpringBoot 整合 ShardingSphere4.1.1实现分库分表

    目录 前言 一、ShardingSphere4.1.1的spring boot配置 二、ShardingSphere的分片策略 三、SpringBoot 整合 ShardingSphere4.1.1 四 、ShardingSphere实现分布式事务控制     ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这

    2024年02月08日
    浏览(40)
  • springboot整合sharding-jdbc实现分库分表详解

    目录 一、为什么需要分库分表 1.1 分库分表的优势 二、分库分表基本概念 2.1 垂直分表

    2024年02月05日
    浏览(64)
  • shardingsphere5.x整合springboot分库分表实战

    官方文档不同版本配置变更记录:Spring Boot Start 配置 :: ShardingSphere pom.xml配置: 建表sql: yml配置: orders对象实体: OrdersMapper:  OrdersMapper.xml:  单元测试:  1、插入数据结果,按order_no分片取模,分片数为10,该数据被写入表orders_2: 2、查询数据sql,按order_no分片取模,分

    2024年02月07日
    浏览(42)
  • shardingsphere5.x整合springboot+dynamic-datasource多数据源实战

    本文是在springboot整合分库分表的基础上添加了多数据源,建议先看上一篇shardingsphere5.x整合springboot分库分表实战_任人人人呢的博客-CSDN博客 pom.xml配置: yml配置: 添加多数据源配置类: 添加多数据源常量类: Mapper文件

    2024年02月13日
    浏览(40)
  • SpringBoot 整合JDBC

    Sping Data 官网:https://spring.io/projects/spring-data 数据库相关的启动器 :可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.6.5/reference/htmlsingle/#using-boot-starter 新建一个项目测试:springboot-data-jdbc ; 引入相应的模 项目建好之后,发现自动帮我们导入了如下的启动器: 编写yaml配置

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包