01-读写分离测试案例,它使用客户端直连数据
分享于 点击 25281 次 点评:90
01-读写分离测试案例,它使用客户端直连数据
二、读写分离案例
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:测试
- 添加数据
- 修改数据
- 删除数据
- 查询数据
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>
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', '苏州');
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:接口测试
- 这里就不过多地演示,上述代码可以正常运行
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:测试
- 添加数据
- 修改数据
- 删除数据
- 查询数据
用户点评