SpringBoot詳解如何實(shí)現(xiàn)讀寫分離
前言
根據(jù)公司業(yè)務(wù)需求,項(xiàng)目需要讀寫分離,所以記錄下讀寫分離的過程。
分為兩個部分:
1.項(xiàng)目的讀寫分離。
2.mysql數(shù)據(jù)庫的主從復(fù)制。
本篇使用的依賴包為sharding-jdbc-spring-boot-starter,也有考慮直接用dynamic-datasource-spring-boot-starter,但是需要在程序中顯式的聲明所指定的數(shù)據(jù)源,并且在從庫>=2 的時候需要自己寫算法進(jìn)行讀庫的選擇。而sharding-jdbc支持讀庫的負(fù)載均衡策略,sharding會根據(jù)語句的關(guān)鍵字來決定是讀操作還是寫操作
Insert選擇主庫
Select選擇從庫2(由于設(shè)置的了輪詢,所以下一次就是從庫1)
1.項(xiàng)目引入依賴
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
2.yml配置
共有三臺機(jī)器,
主庫一臺(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節(jié)點(diǎn)的負(fù)載均衡均衡策略,采用輪詢機(jī)制
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.測試
第一次讀數(shù)據(jù)(從庫1)
第二次讀數(shù)據(jù)(從庫2)
主庫寫
項(xiàng)目讀寫分離基本實(shí)現(xiàn)。
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會被認(rèn)為是不合法的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
到此這篇關(guān)于SpringBoot詳解如何實(shí)現(xiàn)讀寫分離的文章就介紹到這了,更多相關(guān)SpringBoot讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot基于Mybatis mysql實(shí)現(xiàn)讀寫分離
- Springboot + Mysql8實(shí)現(xiàn)讀寫分離功能
- SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼
- SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫分表與讀寫分離的示例
- springboot結(jié)合mysql主從來實(shí)現(xiàn)讀寫分離的方法示例
- SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法
- 使用springboot aop來實(shí)現(xiàn)讀寫分離和事物配置
- SpringBoot自定義注解使用讀寫分離Mysql數(shù)據(jù)庫的實(shí)例教程
- springboot多數(shù)據(jù)源配合docker部署mysql主從實(shí)現(xiàn)讀寫分離效果
- SpringBoot+MyBatis+AOP實(shí)現(xiàn)讀寫分離的示例代碼
- SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離詳解
- SpringBoot配置主從數(shù)據(jù)庫實(shí)現(xiàn)讀寫分離
相關(guān)文章
基于OpenCv與JVM實(shí)現(xiàn)加載保存圖像功能(JAVA?圖像處理)
openCv有一個名imread的簡單函數(shù),用于從文件中讀取圖像,本文給大家介紹JAVA?圖像處理基于OpenCv與JVM實(shí)現(xiàn)加載保存圖像功能,感興趣的朋友一起看看吧2022-01-01SpringSecurity整合jwt權(quán)限認(rèn)證的全流程講解
這篇文章主要介紹了SpringSecurity整合jwt權(quán)限認(rèn)證的全流程講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java如何導(dǎo)入Jsoup庫做一個有趣的爬蟲項(xiàng)目
Jsoup庫是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫做一個有趣的爬蟲項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2023-11-11SpringCloud超詳細(xì)講解負(fù)載均衡組件Ribbon源碼
在微服務(wù)中,對服務(wù)進(jìn)行拆分之后,必然會帶來微服務(wù)之間的通信需求,而每個微服務(wù)為了保證高可用性,又會去部署集群,那么面對一個集群微服務(wù)進(jìn)行通信的時候,如何進(jìn)行負(fù)載均衡也是必然需要考慮的問題2022-07-07詳解MybatisPlus中@TableLogic注解的使用
@TableLogic一般用于實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)邏輯刪除,本文我們將介紹 @TableLogic 注解的用法,以及每個屬性的實(shí)際意義和用法,感興趣的可以了解一下2022-06-06JavaCV攝像頭實(shí)戰(zhàn)之實(shí)現(xiàn)口罩檢測
這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)口罩檢測,功能是檢測攝像頭內(nèi)的人是否帶了口罩,把檢測結(jié)果實(shí)時標(biāo)注在預(yù)覽窗口。感興趣的可以試一試2022-01-01