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

yizhihongxing

下面我将详细讲解如何使用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日

相关文章

  • Struts2修改上传文件大小限制方法解析

    当我们使用Struts2框架进行文件上传时,有时候会遇到上传的文件大小超过了限制的问题。默认情况下,Struts2上传文件大小限制为2M,如果需要修改文件上传大小限制,则需要进行如下操作: 步骤1:添加struts.xml配置 在struts.xml配置文件中添加以下配置,其中10485760代表文件大小限制为10M。 <interceptors&gt…

    Java 2023年5月19日
    00
  • Java线程池的分析和使用详解

    Java线程池的分析和使用详解 线程池的概念 线程池(thread pool)是线程管理的一种机制,它能够让我们更加方便地管理大量的线程,避免了频繁地创建和销毁线程,提高了程序的效率。Java中通过java.util.concurrent包提供了线程池的实现。 线程池的特点 控制线程数量 重复利用线程 管理线程 线程池的类型 Java中的线程池主要有以下4种…

    Java 2023年5月19日
    00
  • java web实现简单聊天室

    以下是实现简单聊天室的完整攻略。 第一步:搭建环境 Java Web开发需要安装JDK、Tomcat等相关软件,具体步骤如下: 安装JDK:在官网下载合适版本并安装; 安装Tomcat:在官网下载合适版本并解压到指定目录; 配置环境变量:将Tomcat的bin目录添加到环境变量Path中。 第二步:编写HTML/CSS页面 用HTML/CSS实现聊天室的前端…

    Java 2023年6月15日
    00
  • 微信小程序与Java后端接口交互

    本文将详细讲解如何使用微信小程序与Java后端接口进行交互,包括前后端分离、接口设计、数据传输格式、跨域问题解决、以及接口测试等方面。 前后端分离 前后端分离是指将前端界面和后端数据接口分离开来,前端与后端之间通过HTTP/HTTPS协议进行通信,并通过JSON等数据传输格式进行数据交互。这样可以使前后端职责分离,提高代码复用性和可维护性。 接口设计 在进行…

    Java 2023年5月23日
    00
  • 详解Spring Security 中的四种权限控制方式

    下面我将详细讲解“详解Spring Security 中的四种权限控制方式”: 1. 认证和鉴权 几乎所有的Spring Security权限控制都需要经过两个基本步骤:认证和鉴权。 认证(Authentication):指确定用户的身份,通常是用户提供用户名和密码给系统来验证其是否能够登录。 鉴权(Authorization):指确定用户是否有权限访问某些…

    Java 2023年5月20日
    00
  • 什么是方法区?

    以下是关于 Java 方法区的详细讲解: 什么是方法区? Java 方法区是一种用于存储已加载类信息、常量、静态变量、即时编译器编译后的代码数据的内存区域。方法区是线程共享的,的大小可以通过 -XX:MaxMetaspaceSize 参数进行设置。 Java 方法区使用攻略 使用 Java 方法区,需要注意以下几点: 在程序开发中,需要合理内存,避免出现内存…

    Java 2023年5月12日
    00
  • Spring Boot Logging Level设置为off时的Bug

    为了更好的解释“Spring Boot Logging Level设置为off时的Bug”问题以及解决方案,我们需要先了解以下几个问题: 什么是Logging Level Spring Boot默认的Logging Level设置 Logging Level为off时会出现什么问题 如何避免Logging Level为off导致的问题 现在我们按照这个顺序来…

    Java 2023年5月20日
    00
  • Java回溯法解决全排列问题流程详解

    Java回溯法解决全排列问题流程详解 什么是全排列问题 全排列问题是指对于给定的一组数,找到其所有可能的排列方式。比如,对于数字1、2、3,它们的全排列为: 123 132 213 231 312 321 解决全排列问题的方法 一般来说,全排列问题可以使用回溯法(backtracking)进行解决。回溯法是一种搜索算法,它通过不断地尝试各种可能性来逐步得到问…

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