SpringBoot整合Sharding-JDBC实现MySQL8读写分离

下面我将详细讲解如何使用SpringBoot整合Sharding-JDBC实现MySQL8读写分离的过程,包括环境搭建、配置文件编写、代码实现和示例说明等:

一、环境搭建

  1. 使用MySQL8搭建读写分离环境并创建两个数据库:sharding_db_0sharding_db_1,分别对应写库和读库。

  2. 在maven中引入Sharding-JDBC和相关依赖:
    xml
    <dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
    </dependency>
    <dependency>
    <groupId>com.mysql.cj</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
    </dependency>

二、配置文件编写

  1. application.yml中配置数据源和Sharding-JDBC:
    yaml
    spring:
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/
    username: root
    password: root
    shardingsphere:
    datasource:
    primary:
    url: jdbc:mysql://localhost:3306/sharding_db_0?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    replica:
    url: jdbc:mysql://localhost:3306/sharding_db_1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    # 配置数据源的负载均衡
    props:
    sql:
    show: true
    # 配置分片规则
    sharding:
    tables:
    user:
    actual-data-nodes: primary.user,replica.user
    key-generator:
    column: id
    type: SNOWFLAKE
    database-strategy:
    inline:
    algorithm-expression: primary
    # 配置读写分离规则
    # 主库路由规则
    master-slave-rules:
    master-data-source-name: primary
    slave-data-source-names: replica
    load-balance-algorithm-type: ROUND_ROBIN
    # 是否开启只读功能
    read-only: true

  2. 配置Sharding-JDBC属性文件sharding-jdbc.yml
    ```yaml
    # 配置一个Datasource,这里的Datasource使用的就是ShardingSphere-JDBC内置的单库数据源DBCP2
    dataSources:
    primary:
    url: jdbc:mysql://localhost:3306/sharding_db_0?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    # 设置限制连接数最大值和闲置时间,尤其在高并发场景下,这个配置项非常重要,恰当的设置可以减速对数据库的冲击,避免系统瘫痪。
    maxPoolSize: 50
    minPoolSize: 25
    idleTimeout: 6000
    replica:
    url: jdbc:mysql://localhost:3306/sharding_db_1?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    # 配置默认规则
    rules:
    # 配置分片规则

    • !SHARDING
      tables:
      user:
      # 实际数据节点
      actualDataNodes: primary.user, replica.user
      # 数据分片策略
      databaseStrategy:
      inline:
      # 表示使用id字段mod 2的结果作为路由的数据
      shardingColumn: id
      # 配置具体的Sharding策略,如果是单分片键,可以使用StandardShardingStrategy
      algorithmExpression: primary
      # 主键生成策略
      keyGenerator:
      column: id
      type: SNOWFLAKE
      # 配置读写分离规则
      masterSlaveRules:
      # 主库名称,对应sharding-jdbc.yml中关联的数据源名称
      - name: primary
      # 从库名称,对应sharding-jdbc.yml中关联的数据源名称
      slaveDataSourceNames:
      - replica
      # 负载均衡策略
      loadBalanceAlgorithmType: ROUND_ROBIN
      ```

三、代码实现

  1. 创建User实体类,用于映射user表:
    ```java
    public class User {
    private Long id;
    private String username;
    private String password;

    // 省略getters、setters、构造函数
    }
    ```

  2. 创建UserMapper接口和UserMapper.xml文件,用于执行CRUD操作:
    java
    public interface UserMapper {
    int save(User user);
    List<User> findAll();
    }

    xml
    <mapper namespace="com.example.demo.mapper.UserMapper">
    <insert id="save" parameterType="com.example.demo.entity.User">
    insert into user (id, username, password) values (#{id}, #{username}, #{password})
    </insert>
    <select id="findAll" resultType="com.example.demo.entity.User">
    select * from user
    </select>
    </mapper>

  3. 创建UserController类,用于测试读写分离:
    ```java
    @RestController
    @RequestMapping("/user")
    public class UserController {
    @Autowired
    private UserMapper userMapper;

    @PostMapping("/save")
    public String save(@RequestBody User user) {
    userMapper.save(user);
    return "success";
    }

    @GetMapping("/findAll")
    public List findAll() {
    return userMapper.findAll();
    }
    }
    ```

四、示例说明

  1. 插入一条记录并查看主从数据库是否都有数据:
    curl
    curl --location --request POST 'http://localhost:8080/user/save' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "id": 1,
    "username": "test",
    "password": "123456"
    }'

    查询从库:
    mysql
    mysql> select * from sharding_db_1.user;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | test | 123456 |
    +----+----------+----------+

    查询主库:
    mysql
    mysql> select * from sharding_db_0.user;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | test | 123456 |
    +----+----------+----------+

  2. 查询记录时查看是否自动路由到从库:
    curl
    curl --location --request GET 'http://localhost:8080/user/findAll'

    查看控制台日志输出,可以看到读请求已经使用了从库:
    log
    o.a.s.c.s.p.ShardingSphereMasterSlaveDataSource - Current datasource is [replica], SQL: select * from user

到此,SpringBoot整合Sharding-JDBC实现MySQL8读写分离的完整攻略就讲解完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Sharding-JDBC实现MySQL8读写分离 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java的Struts框架报错“ForwardConfigException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ForwardConfigException”错误。这个错误通常由以下原因之一起: 无效的转发路径:如果转发路径无效,则可能会出现此错误。在这种情况下,需要检查转发路径以解决此问题。 无效的转发名称:如果转发名称无效,则可能会出现此错误。在这种情况下,需要检查转发名称以解决此问题。 以下是两个实例: 例 1 如…

    Java 2023年5月5日
    00
  • 微信小程序+后端(java)实现开发

    当使用微信小程序进行开发时,为了实现一些对数据的获取、修改、删除等操作,我们需要使用后端技术来支持。Java是一种常用的后端开发语言,下面将为大家详细讲解“微信小程序+后端(java)实现开发”的完整攻略。 1. 前置知识 在学习和使用微信小程序和后端(java)开发之前,需要具备以下基础知识: HTML、JavaScript、CSS基础知识。 Vue.js…

    Java 2023年5月18日
    00
  • Java中类的加载顺序剖析(常用于面试题)

    Java中类的加载顺序剖析 在Java中,类的加载顺序是一个很重要的概念,也是经常出现在面试题中的一个考点。本文将会详细讲解Java中类的加载顺序,并且提供相关的代码示例。 类的生命周期 在深入讲解类的加载顺序之前,我们需要先了解Java中类的生命周期。Java中类的生命周期分为五个部分:加载、验证、准备、解析、初始化。 加载:在该阶段,Java虚拟机将会从…

    Java 2023年5月26日
    00
  • Spring MVC 简单的hello world的实现

    Spring MVC是一种基于Java的Web框架,它可以帮助我们快速地开发Web应用程序。在本文中,我们将详细介绍如何使用Spring MVC实现一个简单的“Hello, world!”应用程序。 环境准备 在开始之前,我们需要准备好以下环境: JDK 1.8或更高版本 Maven 3.0或更高版本 IntelliJ IDEA或Eclipse等Java I…

    Java 2023年5月17日
    00
  • Java日常练习题,每天进步一点点(48)

    该题目是一道Java语言的练习题,侧重于帮助学习者通过自我练习提高Java编程能力,增强对Java知识的掌握和理解。 本题主要包含以下几个部分: 题目描述:阐述了本题需要实现的功能要求以及细节要求,一般以文字的形式呈现。 代码说明:该部分通常提供的是代码的框架,可能包含已经定义好的变量、方法和类等基本的代码结构,需要学习者根据题目要求进行补充和完善。 解题思…

    Java 2023年5月23日
    00
  • Java ConcurrentModificationException异常解决案例详解

    为了解决“Java ConcurrentModificationException异常”,我们需要从以下几个方面入手:原因分析、解决方法和代码示例。 原因分析 Java ConcurrentModificationException 异常通常发生在多个线程操作同一集合对象的时候。在一个线程正在读取该集合的同时,另一个线程修改了该集合,导致第一个线程遍历时出现…

    Java 2023年5月27日
    00
  • Java实现二分搜索树的示例代码

    下面我将详细讲解“Java实现二分搜索树的示例代码”的完整攻略。 什么是二分搜索树? 首先,我们需要明确什么是二分搜索树(BST)。 二分搜索树是一种二叉树,其中每个节点都有一个键值,且每个节点的键值都大于左子树中任意一个节点的键值,小于右子树中任意一个节点的键值。这种性质使得查找、插入、删除节点的操作都可以在时间复杂度为O(logN)的时间内完成,非常适合…

    Java 2023年5月23日
    00
  • Java初学者问题图解(动力节点Java学院整理)

    对于“Java初学者问题图解(动力节点Java学院整理)”这个主题,我可以提供以下完整攻略: Java初学者问题图解 前言 Java作为一门广受欢迎的编程语言,吸引了许多初学者,但在学习过程中难免会遇到问题。本文就对Java学习过程中常见的问题进行了整理,并提供了图解和解决方法。 字符串问题 1. 字符串比较 问题描述:如何比较两个字符串是否相等? 问题分析…

    Java 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部