SpringBoot怎么实现读写分离

这篇文章主要讲解了“SpringBoot怎么实现读写分离”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么实现读写分离”吧!

前言

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

分为两个部分:

1.项目的读写分离。

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

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

Insert选择主库

SpringBoot怎么实现读写分离  springboot 第1张

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

SpringBoot怎么实现读写分离  springboot 第2张

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.启动

SpringBoot怎么实现读写分离  springboot 第3张

4.测试

第一次读数据(从库1)

SpringBoot怎么实现读写分离  springboot 第4张

SpringBoot怎么实现读写分离  springboot 第5张

SpringBoot怎么实现读写分离  springboot 第6张

第二次读数据(从库2)

SpringBoot怎么实现读写分离  springboot 第7张

SpringBoot怎么实现读写分离  springboot 第8张

SpringBoot怎么实现读写分离  springboot 第9张

主库写

SpringBoot怎么实现读写分离  springboot 第10张

SpringBoot怎么实现读写分离  springboot 第11张

SpringBoot怎么实现读写分离  springboot 第12张

项目读写分离基本实现。

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

SpringBoot怎么实现读写分离  springboot 第13张

:wq

感谢各位的阅读,以上就是“SpringBoot怎么实现读写分离”的内容了,经过本文的学习后,相信大家对SpringBoot怎么实现读写分离这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是蜗牛博客,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram