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项目的目录结构详解

    下面我来详细讲解Java项目的目录结构: 1. 为什么需要规范的目录结构 在一个Java项目中使用规范的目录结构,可以帮助我们清晰地组织我们写的代码,管理项目中的不同模块,提高我们的项目管理和团队协作效率。 2. Java项目的目录结构 下面是Java项目的目录结构示意图: project ├── src │ ├── main │ │ ├── java # …

    Java 2023年5月20日
    00
  • 面试官:怎么做JDK8的垃圾收集器的调优(面试常问)

    下面是关于如何做 JDK8 的垃圾收集器调优的完整攻略: 前言 Java 作为一门高级语言,在垃圾回收上具有很大优势,JDK8 中垃圾收集器不仅越来越多,同时也变得越来越复杂。垃圾收集器调优无疑成为优化 Java 性能的关键),以下将详细介绍如何做JDK8的垃圾收集器调优。 收集器种类 JDK8 中常用的垃圾收集器有以下几种: Serial 收集器:适用于单…

    Java 2023年5月26日
    00
  • SpringMVC接收前台传递过来的值的实例

    下面我来详细讲解“SpringMVC接收前台传递过来的值的实例”的完整攻略。 1. 前置条件 在开始之前,需要保证你已经: 安装了Java开发环境(JDK) 安装了Spring框架 2. 实例1:接收表单数据 假设我们有一个表单页面,其中包含一个输入框和一个提交按钮,我们需要在后台接收前台传递过来的输入框的值。以下是实现过程: 在表单页面中,添加一个输入框和…

    Java 2023年6月15日
    00
  • Java实现的数组去重与排序操作详解

    Java实现的数组去重与排序操作详解 1. 去重操作 1.1 利用HashSet去重 利用HashSet可以对无序数组进行去重,操作属于较为简单的算法。 示例代码如下: public static int[] removeDuplicates(int[] nums) { Set<Integer> set = new HashSet<>…

    Java 2023年5月26日
    00
  • SpringBoot基于HttpMessageConverter实现全局日期格式化

    下面是详细讲解“SpringBoot基于HttpMessageConverter实现全局日期格式化”的完整攻略。 1. 什么是HttpMessageConverter HttpMessageConverter 是 Spring 框架中的一个接口,用于将请求和响应的数据转换为特定的格式。它可以将浏览器提交的数据(如:application/json 、 app…

    Java 2023年5月20日
    00
  • 使用Spring Data JDBC实现DDD聚合的示例代码

    使用Spring Data JDBC实现DDD聚合的示例代码是一个比较复杂的过程,需要在DDD(领域驱动设计)的思想指导下,设计实现聚合及其关联的实体、值对象等等。以下是一个完整的攻略: 一、设计实体和聚合 首先需要确定需要实现的实体和聚合,并了解其业务含义和关系。 示例一:订单聚合 假设我们设计的一个电商系统,需要实现订单聚合,聚合中包含订单及其关联的商品…

    Java 2023年5月20日
    00
  • Groovy动态语言使用教程简介

    Groovy动态语言使用教程简介 什么是Groovy动态语言 Groovy是一种基于JVM的动态语言,它可以与Java语言无缝集成并且具备很多Java语言的特性。Groovy动态语言的主要特点是它支持运行时的元编程和动态方法调用,使得程序员可以更加灵活地开发项目并提高开发效率。 Groovy的安装和配置 在使用Groovy之前,需要安装和配置相应的环境。以下…

    Java 2023年5月26日
    00
  • Java JDBC批量执行executeBatch方法详解

    下面是“Java JDBC批量执行executeBatch方法详解”的完整攻略: 什么是executeBatch方法 在使用JDBC操作数据库时,我们有时候需要往数据库中插入或者更新大批量的数据。这时候如果每次执行一次SQL语句,就会影响程序的效率。JDBC提供了executeBatch方法,可以将多个SQL语句一次性提交到数据库中执行,从而提高程序的效率。…

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