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日

相关文章

  • springboot实用配置详细图文教程

    我来为你详细讲解“springboot实用配置详细图文教程”的完整攻略。 1. 准备工作 首先,我们需要安装以下几个软件:- JDK 1.8+- Maven- IDE(如IntelliJ IDEA) 2. 创建Spring Boot项目 现在,我们可以开始创建一个Spring Boot项目了。在IDE中,选择新建一个Maven项目,选择Spring Init…

    Java 2023年5月31日
    00
  • 详解Java冒泡排序

    详解Java冒泡排序 什么是冒泡排序 冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地走过要排序的元素列表,比较相邻两个元素的大小,如果顺序错误则交换这两个元素。重复地进行比较和交换操作,直到整个列表排序完成。 在这个过程中,会先比较第1个和第2个元素的大小,如果第1个大于第2个,则交换它们的位置;接着比较第2个和第3个元素的大小,如果第2…

    Java 2023年5月19日
    00
  • Spring 异常单元测试的解决

    对于“Spring 异常单元测试的解决”的完整攻略,可以分为以下几个步骤来进行讲解。 步骤一:添加必要的依赖 在开始进行 Spring 异常单元测试前,需要在项目文件中添加必要的依赖。这里我们需要添加 JUnit 和 Spring Test 的依赖。 <dependency> <groupId>org.junit.jupiter&lt…

    Java 2023年5月27日
    00
  • 如何清除网页上的不明的浮动广告和漂浮的图片

    清除网页上的浮动广告和漂浮图片可以通过CSS实现。以下是实现步骤: 步骤一:找到不明的浮动广告和漂浮的图片的CSS选择器 首先,需要找到这些浮动元素的CSS选择器名称,这可以通过浏览器开发者工具中的“选取元素”功能找到。开发者工具会显示当前选定元素的CSS选择器。如果找到的是一个广告插件,则可以通过插件名称或插件代码中的唯一标识符来查找。 例如,如果要删除百…

    Java 2023年5月23日
    00
  • java swing编程入门代码编写(java编程入门)

    Java Swing是一种基于Java语言的GUI(图形用户界面)编程框架。通过使用Swing框架,开发人员可以轻松地构建具有丰富功能和良好交互性的应用程序。 以下是Java Swing编程入门的完整攻略: 1. 准备工作 在开始编写Java Swing代码之前,需要准备以下工具: JDK:Java开发工具包(JDK)是编写Java应用程序所必需的。确保已安…

    Java 2023年5月19日
    00
  • 利用数组实现栈(Java实现)

    下面就详细讲解一下“利用数组实现栈(Java实现)”的完整攻略。 一、栈的概念 栈是一种具有特殊性质的线性结构,它只允许在一端进行插入和删除操作,这一端被称为栈顶。具体来说,栈的特点是后进先出(Last In First Out,LIFO)。 二、栈的实现 栈可以使用数组实现,这里我们介绍一种基于数组的简单栈实现方法: public class MyStac…

    Java 2023年5月26日
    00
  • Tomcat 实现WebSocket详细介绍

    Tomcat 实现WebSocket详细介绍 什么是WebSocket? WebSocket是HTML5中的一个协议,它的目标是在Web浏览器和服务器之间建立实时、双向的通信会话,以便实现更好的实时性和降低通信量。以前,为了实现实时通信,使用一些技术如Ajax、Comet等技术,但它们都存在着一些问题,而WebSocket协议能够有效地解决这些问题,因此得到…

    Java 2023年5月19日
    00
  • js 判断登录界面的账号密码是否为空

    首先需要了解“js 判断登录界面的账号密码是否为空”这个问题的背景与目的。这个问题是指在前端页面中,需要判断用户输入的账号密码是否为空,以防止用户提交空的数据或者提交错误的数据,从而提高用户体验和系统安全性。 解决这个问题的核心思路是通过正则表达式对用户输入的内容进行匹配,判断是否为空。以下是具体步骤: 获取用户输入的账号和密码,可以使用document.g…

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