二、读写分离案例
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>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.46</version>
- </dependency>
-
- <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>
-
- </dependencies>
- <build>
-
- <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坐标
-
- <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:测试
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |