二、讀寫分離案例 2.1、背景介紹 面對日益增加的系統訪問量,資料庫的吞吐量面臨著巨大瓶頸,對於同一時刻有大量併發讀操作和較少寫操作類型的應用系統來說,將資料庫拆分為主庫和從庫,主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作,這樣可以有效地避免由數據更新導致的行鎖,使得整個系統的查詢性能得到極 ...
二、讀寫分離案例
2.1、背景介紹
- 面對日益增加的系統訪問量,資料庫的吞吐量面臨著巨大瓶頸,對於同一時刻有大量併發讀操作和較少寫操作類型的應用系統來說,將資料庫拆分為主庫和從庫,主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作,這樣可以有效地避免由數據更新導致的行鎖,使得整個系統的查詢性能得到極大的改善(通過讀寫分離,就可以降低單台資料庫的訪問壓力,提高訪問效率,也可以避免單機故障)
2.2、ShardingJDBC介紹
-
Sharding-JDBC定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連資料庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全相容JDBC和各種ORM框架。
- 使用Sharding-JDBC可以在程式中輕鬆的實現資料庫讀寫分離
-
Sharding-JDBC的特點
- ①、 適用於任何基於JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
- ②、支持任何第三方的資料庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等
- ③、支持任意實現JDBC規範的資料庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標準的資料庫
-
導入Sharding-JDBC依賴
-
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
-
2.3、測試工程創建
2.3.1、數據準備
-
CREATE DATABASE tb_user; USE tb_user; CREATE TABLE t_user( NAME VARCHAR(30), sex CHAR, location VARCHAR(50) )ENGINE = INNODB DEFAULT CHARSET=utf8; INSERT INTO t_user VALUES ('h1', 'm', '廣州'), ('h2', 'w', '深圳'), ('h3', 'm', '上海'), ('h4', 'w', '北京'), ('h5', 'w', '蘇州');
2.3.1、簡易SpringBoot項目搭建
-
Step1:初始項目結構如下所示
-
Step2:編寫基本的增刪改查業務操作
-
編寫業務操作之前,添加資料庫連接的相關pom配置和yml配置
-
pom坐標導入
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.coolman</groupId> <artifactId>HelloWorld</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <!--導入父模塊--> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.3.3.RELEASE</version> </parent> <dependencies> <!-- SpringBoot啟動器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--lombok配置--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--mysql驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--mybatis啟動器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!--資料庫連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version> </dependency> <!--讀寫分離:ShardingJDBC--> </dependencies> <build> <!--指定打包後jar的名字--> <finalName>helloWorld</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
-
yml配置文件編寫
-
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8 username: root password: root mybatis: type-aliases-package: com.coolman.model # configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true mapper-locations: - classpath:mappers/*.xml server: port: 80
-
-
編寫業務操作代碼
-
package com.coolman.controller; import com.coolman.model.User; import com.coolman.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @Slf4j public class HelloWorldController { @Autowired private UserService userService; @GetMapping("/hello") public String sayHello() { log.info("==========hahhhhhhhhhhhhhhhhh========="); return "hello coolman"; } // 查詢 @GetMapping("/select") public List<User> selectAll() { return userService.selectAll(); } // 增加 @PostMapping ("/add") public String add(@RequestBody User user) { userService.add(user); return "添加成功,User = " + user; } // 刪除 @DeleteMapping("/delete") public String delete(Integer id) { userService.delete(id); return "刪除成功, id = " + id; } // 修改 @PutMapping("/edit") public String edit(@RequestBody User user) { userService.edit(user); return user + ""; } }
-
-
-
Step3:介面測試
- 這裡就不過多地演示,上述代碼可以正常運行
2.3.3、引入Sharding-JDBC,並測試
-
Step1:在pom文件中增加sharding-jdbc的maven坐標
-
<!--讀寫分離:ShardingJDBC--> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
-
-
Step2:在application.yml文件中增加數據源的配置
-
#spring: # datasource: # driver-class-name: com.mysql.jdbc.Driver # url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8 # username: root # password: root spring: shardingsphere: datasource: names: master,slave # 主數據源 master: type: com.alibaba.druid.pool.DruidDataSource dirver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8 username: root password: root #從數據源 slave: type: com.alibaba.druid.pool.DruidDataSource dirver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.222.140:3306/tb_user?useSSL=false&characterEncoding=UTF-8 username: root password: root masterslave: # 讀寫分離配置 load-balance-algorithm-type: round_robin # 輪詢負載均衡 # 最終的數據源名稱 name: dataSource # 主資料庫的名稱 master-data-source-name: master slave-data-source-names: slave props: sql: show: true # 開啟SQL顯示,預設為false mybatis: type-aliases-package: com.coolman.model # configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true mapper-locations: - classpath:mappers/*.xml server: port: 80
-
配置解析
-
-
Step3:在application.yml中增加配置
-
spring: main: # 該配置項的目的,就是如果當前項目中存在同名的bean,後定義的bean會覆蓋先定義的。 # 如果不配置該項,項目啟動之後會報錯 allow-bean-definition-overriding: true
-
-
Step4:測試
- 添加數據
- 修改數據
- 刪除數據
- 查詢數據
- 添加數據