SpringBoot詳解如何實現讀寫分離
前言
根據公司業務需求,項目需要讀寫分離,所以記錄下讀寫分離的過程。
分為兩個部分:
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讀寫分離內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot項目中如何實現MySQL讀寫分離詳解
- 分析MySQL拋出異常的幾種常見解決方式
- SpringBoot集成Druid連接池連接MySQL8.0.11
- MySQL的driverClassName與url使用方式
- 使用sharding-jdbc實現水平分庫+水平分表的示例代碼