01-读写分离测试案例

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

二、读写分离案例

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依赖

      1. <dependency>
      2.     <groupId>org.apache.shardingsphere</groupId>
      3.     <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
      4.     <version>4.0.0-RC1</version>
      5. </dependency>
      复制代码

2.3、测试工程创建

2.3.1、数据准备


    1. CREATE DATABASE tb_user;
    2. USE tb_user;
    3. CREATE TABLE t_user(
    4. NAME VARCHAR(30),
    5. sex CHAR,
    6. location VARCHAR(50)
    7. )ENGINE = INNODB DEFAULT CHARSET=utf8;
    8. INSERT INTO t_user VALUES
    9. ('h1', 'm', '广州'),
    10. ('h2', 'w', '深圳'),
    11. ('h3', 'm', '上海'),
    12. ('h4', 'w', '北京'),
    13. ('h5', 'w', '苏州');
    复制代码
2.3.1、简易SpringBoot项目搭建


  • Step1:初始项目结构如下所示



  • Step2:编写基本的增删改查业务操作

    • 编写业务操作之前,添加数据库连接的相关pom配置和yml配置
    • pom坐标导入

        1. <?xml version="1.0" encoding="UTF-8"?>
        2. <project xmlns="http://maven.apache.org/POM/4.0.0"
        3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        5.     <modelVersion>4.0.0</modelVersion>
        6.     <groupId>com.coolman</groupId>
        7.     <artifactId>HelloWorld</artifactId>
        8.     <version>1.0-SNAPSHOT</version>
        9.     <properties>
        10.         <maven.compiler.source>8</maven.compiler.source>
        11.         <maven.compiler.target>8</maven.compiler.target>
        12.     </properties>
        13.    
        14.     <parent>
        15.         <artifactId>spring-boot-starter-parent</artifactId>
        16.         <groupId>org.springframework.boot</groupId>
        17.         <version>2.3.3.RELEASE</version>
        18.     </parent>
        19.     <dependencies>
        20.         
        21.         <dependency>
        22.             <groupId>org.springframework.boot</groupId>
        23.             <artifactId>spring-boot-starter-web</artifactId>
        24.         </dependency>
        25.         
        26.         <dependency>
        27.             <groupId>org.projectlombok</groupId>
        28.             <artifactId>lombok</artifactId>
        29.         </dependency>
        30.         
        31.         <dependency>
        32.             <groupId>mysql</groupId>
        33.             <artifactId>mysql-connector-java</artifactId>
        34.             <version>5.1.46</version>
        35.         </dependency>
        36.         
        37.         <dependency>
        38.             <groupId>org.mybatis.spring.boot</groupId>
        39.             <artifactId>mybatis-spring-boot-starter</artifactId>
        40.             <version>2.2.0</version>
        41.         </dependency>
        42.         
        43.         <dependency>
        44.             <groupId>com.alibaba</groupId>
        45.             <artifactId>druid-spring-boot-starter</artifactId>
        46.             <version>1.1.23</version>
        47.         </dependency>
        48.         
        49.     </dependencies>
        50.     <build>
        51.         
        52.         <finalName>helloWorld</finalName>
        53.         <plugins>
        54.             <plugin>
        55.                 <groupId>org.springframework.boot</groupId>
        56.                 <artifactId>spring-boot-maven-plugin</artifactId>
        57.             </plugin>
        58.         </plugins>
        59.     </build>
        60. </project>
        复制代码

    • yml配置文件编写

        1. spring:
        2.   datasource:
        3.     driver-class-name: com.mysql.jdbc.Driver
        4.     url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8
        5.     username: root
        6.     password: root
        7. mybatis:
        8.   type-aliases-package: com.coolman.model   #
        9.   configuration:
        10.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        11.     map-underscore-to-camel-case: true
        12.   mapper-locations:
        13.     - classpath:mappers/*.xml
        14. server:
        15.   port: 80
        复制代码

    • 编写业务操作代码

        1. package com.coolman.controller;
        2. import com.coolman.model.User;
        3. import com.coolman.service.UserService;
        4. import lombok.extern.slf4j.Slf4j;
        5. import org.springframework.beans.factory.annotation.Autowired;
        6. import org.springframework.web.bind.annotation.*;
        7. import java.util.List;
        8. @RestController
        9. @Slf4j
        10. public class HelloWorldController {
        11.     @Autowired
        12.     private UserService userService;
        13.     @GetMapping("/hello")
        14.     public String sayHello() {
        15.         log.info("==========hahhhhhhhhhhhhhhhhh=========");
        16.         return "hello coolman";
        17.     }
        18.     // 查询
        19.     @GetMapping("/select")
        20.     public List<User> selectAll() {
        21.         return userService.selectAll();
        22.     }
        23.     // 增加
        24.     @PostMapping ("/add")
        25.     public String add(@RequestBody User user) {
        26.         userService.add(user);
        27.         return "添加成功,User = " + user;
        28.     }
        29.     // 删除
        30.     @DeleteMapping("/delete")
        31.     public String delete(Integer id) {
        32.         userService.delete(id);
        33.         return "删除成功, id = " + id;
        34.     }
        35.     // 修改
        36.     @PutMapping("/edit")
        37.     public String edit(@RequestBody User user) {
        38.         userService.edit(user);
        39.         return user + "";
        40.     }
        41. }
        复制代码


  • Step3:接口测试

    • 这里就不过多地演示,上述代码可以正常运行

2.3.3、引入Sharding-JDBC,并测试


  • Step1:在pom文件中增加sharding-jdbc的maven坐标

      1.         
      2.         <dependency>
      3.             <groupId>org.apache.shardingsphere</groupId>
      4.             <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
      5.             <version>4.0.0-RC1</version>
      6.         </dependency>
      复制代码

  • Step2:在application.yml文件中增加数据源的配置

      1. #spring:
      2. #  datasource:
      3. #    driver-class-name: com.mysql.jdbc.Driver
      4. #    url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8
      5. #    username: root
      6. #    password: root
      7. spring:
      8.   shardingsphere:
      9.     datasource:
      10.       names: master,slave
      11.       # 主数据源
      12.       master:
      13.         type: com.alibaba.druid.pool.DruidDataSource
      14.         dirver-class-name: com.mysql.jdbc.Driver
      15.         url: jdbc:mysql://192.168.222.135:3306/tb_user?useSSL=false&characterEncoding=UTF-8
      16.         username: root
      17.         password: root
      18.       #从数据源
      19.       slave:
      20.         type: com.alibaba.druid.pool.DruidDataSource
      21.         dirver-class-name: com.mysql.jdbc.Driver
      22.         url: jdbc:mysql://192.168.222.140:3306/tb_user?useSSL=false&characterEncoding=UTF-8
      23.         username: root
      24.         password: root
      25.     masterslave:
      26.       # 读写分离配置
      27.       load-balance-algorithm-type: round_robin  # 轮询负载均衡
      28.       # 最终的数据源名称
      29.       name: dataSource
      30.       # 主数据库的名称
      31.       master-data-source-name: master
      32.       slave-data-source-names: slave
      33.     props:
      34.       sql:
      35.         show: true  # 开启SQL显示,默认为false
      36. mybatis:
      37.   type-aliases-package: com.coolman.model   #
      38.   configuration:
      39.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      40.     map-underscore-to-camel-case: true
      41.   mapper-locations:
      42.     - classpath:mappers/*.xml
      43. server:
      44.   port: 80
      复制代码
    • 配置解析




  • Step3:在application.yml中增加配置

      1. spring:
      2.   main:
      3.     # 该配置项的目的,就是如果当前项目中存在同名的bean,后定义的bean会覆盖先定义的。
      4.     # 如果不配置该项,项目启动之后会报错
      5.     allow-bean-definition-overriding: true
      复制代码

  • Step4:测试

    • 添加数据



    • 修改数据



    • 删除数据



    • 查询数据





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表