百木园-与人分享,
就是让自己快乐。

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

    • 添加数据
    • 修改数据
    • 删除数据
    • 查询数据

来源:https://www.cnblogs.com/OnlyOnYourself-lzw/p/16406826.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 01-读写分离测试案例

相关推荐

  • 暂无文章