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:测试

    • 添加数据
    • 修改数据
    • 删除数据
    • 查询数据
posted @   OnlyOnYourself-Lzw  阅读(303)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示