SpringBoot详解如何实现读写分离
目录
- 前言
- 1.项目引入依赖
- 2.yml配置
- 3.启动
- 4.测试
- 5.中间所遇到的问题
前言 根据公司业务需求,项目需要读写分离,所以记录下读写分离的过程。
【SpringBoot详解如何实现读写分离】分为两个部分:
1.项目的读写分离。
2.mysql数据库的主从复制。
本篇使用的依赖包为sharding-jdbc-spring-boot-starter,也有考虑直接用dynamic-datasource-spring-boot-starter,但是需要在程序中显式的声明所指定的数据源,并且在从库>=2 的时候需要自己写算法进行读库的选择。而sharding-jdbc支持读库的负载均衡策略,sharding会根据语句的关键字来決定是读操作还是写操作
Insert选择主库
文章图片
Select选择从库2(由于设置的了轮询,所以下一次就是从库1)
文章图片
1.项目引入依赖
org.apache.shardingsphere sharding-jdbc-spring-boot-starter4.0.0-RC1
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读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 投稿|除了跨界出装备,品牌如何赶上露营、飞盘热?
- 如何配置Nginx为Node.js服务静态文件
- 如何在Nginx中从AWS,Google Cloud LB和Cloud Flare获取客户端IP()
- 如何在Nginx和Apache中启用IPv6()
- 如何在Apache和Nginx中启用HTTP/2()
- 探索(Nginx Plus的外观如何())
- 如何使用Let’s Encrypt的加密证书设置Nginx()
- 如何在iOS上构建无限Runner(Cocos2D,自动化等)
- 如何使用Amplify监视Nginx和PHP应用程序()
- 如何在Apple Mac OS X上刷新DNS缓存