01-讀寫分離測試案例

来源:https://www.cnblogs.com/OnlyOnYourself-lzw/archive/2022/06/23/16406826.html
-Advertisement-
Play Games

二、讀寫分離案例 2.1、背景介紹 面對日益增加的系統訪問量,資料庫的吞吐量面臨著巨大瓶頸,對於同一時刻有大量併發讀操作和較少寫操作類型的應用系統來說,將資料庫拆分為主庫和從庫,主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作,這樣可以有效地避免由數據更新導致的行鎖,使得整個系統的查詢性能得到極 ...


二、讀寫分離案例

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:測試

    • 添加數據
    • 修改數據
    • 刪除數據
    • 查詢數據

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • TinyMCE是一款易用、且功能強大的所見即所得的富文本編輯器。同類程式有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 配置靈活,界面簡潔,支持自定義插件。 TinyMCE中文手冊:http://tinymc ...
  • 一、前言 小編最近開始學習typescript,懂得人都知道,typescript是vue3的基礎伴生,配合更加默契。就像vue2和js一樣!typescript不像js那樣瀏覽器直接可以解讀,需要我們把ts文件編譯成js文件,這樣瀏覽器才可以解讀。所以我們要安裝一下ts的環境和自動編譯,方便我們後 ...
  • 前言 : 組件系統是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可復用的小組件來構建大型應用,任意類型的應用界面都可以抽象為一個組件樹。 現在基於vue的UI組件庫有很多,比如iview,element-ui等。但有時候這些組件庫滿足不了我們的開發需求,這時候我們就需要自己寫 ...
  • 1 前言 在嵌入式MCU軟體開發過程中,程式分層設計也是重中之重,關係到整個軟體開發過程中的協同開發,降低系統軟體的複雜度(複雜問題分解)和依賴關係、同時有利於標準化,便於管理各層的程式,提高各層邏輯的復用等。 2 分層介紹 2.1 硬體抽象層(HAL) 嵌入式開發的核心就是晶元,它提供固定的片內資 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 前言 回歸分析就是用於預測輸入變數(自變數)和輸出變數(因變數)之間的關係,特別當輸入的值發生變化時,輸出變數值也發生改變!回歸簡單來說就是對數據進行擬合。線性回歸就是通過線性的函數對數據進行擬合。機器學習並不能實現預言,只能實現簡單的預測。我們這次對房價關於其他因素的關係。 波士頓房價預測 下載相 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 你知道MySQL索引底層數據結構為啥用B+樹?而不用B樹、紅黑樹或者普通二叉樹? 我: 這事誰知道作 ...
  • 簡介 是什麼? 確保應用能夠在這些環境中運行和通過質量檢測.並且在部署過程中不出現令人頭疼的版本、配置問題,也無需重新編寫代碼和進行故障修複. Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案 系統平滑移植,容器虛擬化技術。 解決了運行環境和配置問題的軟體容器,方便做持續集成 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...