SpringBoot详解如何实现读写分离

 更新时间:2022年05月16日 09:40:09   作者:StrugglingXuYang  
当响应的瓶颈在数据库的时候,就要考虑数据库的读写分离,当然还可以分库分表,那是单表数据量特别大,当单表数据量不是特别大,但是请求量比较大的时候,就要考虑读写分离了.具体的话,还是要看自己的业务...如果还是很慢,那就要分库分表了...我们这篇就简单讲一下读写分离

前言

根据公司业务需求,项目需要读写分离,所以记录下读写分离的过程。

分为两个部分:

1.项目的读写分离。

2.mysql数据库的主从复制。

本篇使用的依赖包为sharding-jdbc-spring-boot-starter,也有考虑直接用dynamic-datasource-spring-boot-starter,但是需要在程序中显式的声明所指定的数据源,并且在从库>=2 的时候需要自己写算法进行读库的选择。而sharding-jdbc支持读库的负载均衡策略,sharding会根据语句的关键字来決定是读操作还是写操作

Insert选择主库

Select选择从库2(由于设置的了轮询,所以下一次就是从库1)

1.项目引入依赖

	<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

2.yml配置

共有三台机器,

主库一台(127.0.0.1)

从库两台(192.168.1.5 192.168.1.6)

spring:
  shardingsphere:
    props:
      sql:
        show: false
    sharding:
      default-data-source-name: master
    masterslave:
      name: ms
      master-data-source-name: master
      slave-data-source-names: slave1,slave2
      #配置slave节点的负载均衡均衡策略,采用轮询机制
      load-balance-algorithm-type: round_robin
    datasource:
      names: master,slave1,slave2
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/life_account_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
        maxPoolSize: 100
        minPoolSize: 5
      slave1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.5:3306/life_account_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: test
        password: Houxuyang123!@#
        maxPoolSize: 100
        minPoolSize: 5
      slave2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.6:3306/life_account_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: test
        password: Houxuyang123!@#
        maxPoolSize: 100
        minPoolSize: 5

3.启动

4.测试

第一次读数据(从库1)

第二次读数据(从库2)

主库写

项目读写分离基本实现。

5.中间所遇到的问题

mysql查询问题

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'life_account_db.acc_order.serial_no' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因:

没有遵循原则的sql会被认为是不合法的sql

1.order by后面的列必须是在select后面存在的

2.select、having或order by后面存在的非聚合列必须全部在group by中存在

解决方法:

修改配置文件:vim /etc/my.cnf

添加:sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

重启mysql:systemctl restart mysqld

:wq

到此这篇关于SpringBoot详解如何实现读写分离的文章就介绍到这了,更多相关SpringBoot读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot访问windows共享文件的方法

    SpringBoot访问windows共享文件的方法

    这篇文章主要介绍了SpringBoot访问windows共享文件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • java实现pdf文件截图的方法【附PDFRenderer.jar下载】

    java实现pdf文件截图的方法【附PDFRenderer.jar下载】

    这篇文章主要介绍了java实现pdf文件截图的方法,结合实例形式分析了java基于PDFRenderer.jar进行pdf文件截图的相关操作技巧,并附带PDFRenderer.jar文件供读者下载使用,需要的朋友可以参考下
    2018-01-01
  • MyBatis生成UUID的实现

    MyBatis生成UUID的实现

    这篇文章主要介绍了MyBatis生成UUID的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java版学生管理系统

    Java版学生管理系统

    这篇文章主要为大家详细介绍了Java版学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • java若依框架集成redis缓存详解

    java若依框架集成redis缓存详解

    今天小编就为大家分享一篇关于java若依框架集成redis缓存的实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • SpringBoot使用CommandLineRunner接口完成资源初始化方式

    SpringBoot使用CommandLineRunner接口完成资源初始化方式

    这篇文章主要介绍了SpringBoot使用CommandLineRunner接口完成资源初始化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Springboot使用POI进行excel文件的导出与下载方式

    Springboot使用POI进行excel文件的导出与下载方式

    这篇文章主要介绍了Springboot使用POI进行excel文件的导出与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 图解分析Javaweb进程与线程

    图解分析Javaweb进程与线程

    这篇文章主要介绍了Javaweb进程与线程的知识,本篇文章通过简要的案例,讲解了它的基础原理与使用,以下就是详细内容,需要的朋友可以参考下
    2022-03-03
  • Spring学习笔记之bean的基础知识

    Spring学习笔记之bean的基础知识

    ean在Spring和SpringMVC中无所不在,将这个概念内化很重要,所以下面这篇文章主要给大家介绍了关于Spring学习笔记之bean基础的相关资料,文中通过示例代码介绍的非常详解,需要的朋友可以参考下。
    2017-12-12
  • 基于java ssm springboot实现选课推荐交流平台系统

    基于java ssm springboot实现选课推荐交流平台系统

    这篇文章主要介绍了选课推荐交流平台系统是基于java ssm springboot来的实现的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论