Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南

Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南

下面是一个详细的教程,指导您如何在 Spring Boot 项目中使用 MyBatis-Flex 配置 ProxySQL 进行 读写分离主从同步 的数据库访问。


🎯 目标

  1. Spring Boot 中连接 ProxySQL
  2. 使用 MyBatis-Flex 访问数据库。
  3. 配置 读写分离延迟检测

🔧 步骤 1:确保 ProxySQL 和 MySQL 主从同步已正确配置

首先,确保您已经正确配置了 ProxySQLMySQL 主从同步

ProxySQL 的默认配置

Hostgroup ID 描述
10 主库(写操作)
20 从库(读操作)

ProxySQL 的数据端口

  • 端口:6033(默认数据接口端口)

🔧 步骤 2:在 Spring Boot 项目中引入依赖

1️⃣ 引入 MyBatis-Flex 的依赖

pom.xml 中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>com.mybatisflex</groupId>
    <artifactId>mybatis-flex-spring-boot-starter</artifactId>
    <version>1.4.3</version>
</dependency>

🔧 步骤 3:配置 application.yml

application.yml 文件中配置 ProxySQL 的数据源。

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:6033/db_order_plus?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  mybatis-flex:
    mapper-locations: classpath:mapper/**/*Mapper.xml
    configuration:
      map-underscore-to-camel-case: true

🔧 步骤 4:配置数据源的读写分离

ProxySQL 中配置 读写分离规则

在 ProxySQL 管理界面执行以下 SQL

sql 复制代码
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup)
VALUES (1, 1, '^SELECT.*', 20),
       (2, 1, '^INSERT.*|^UPDATE.*|^DELETE.*', 10);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

🔧 步骤 5:创建 MyBatis-Flex 的 Mapper 和实体类

1️⃣ 创建实体类

com.example.demo.entity 包中创建一个实体类,例如 Order.java

java 复制代码
package com.example.demo.entity;

public class Order {
    private Long id;
    private String orderName;

    // Getters and Setters
}

2️⃣ 创建 Mapper 接口

com.example.demo.mapper 包中创建一个 Mapper 接口

java 复制代码
package com.example.demo.mapper;

import com.example.demo.entity.Order;
import org.apache.ibatis.annotations.Select;

public interface OrderMapper {
    
    @Select("SELECT * FROM orders WHERE id = #{id}")
    Order selectOrderById(Long id);
}

3️⃣ 创建 Mapper XML 文件

src/main/resources/mapper 目录下创建 OrderMapper.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.OrderMapper">
    <select id="selectOrderById" resultType="com.example.demo.entity.Order">
        SELECT * FROM orders WHERE id = #{id}
    </select>
</mapper>

🔧 步骤 6:创建 Service 和 Controller

1️⃣ 创建 Service

com.example.demo.service 包中创建一个 OrderService

java 复制代码
package com.example.demo.service;

import com.example.demo.entity.Order;
import com.example.demo.mapper.OrderMapper;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    private final OrderMapper orderMapper;

    public OrderService(OrderMapper orderMapper) {
        this.orderMapper = orderMapper;
    }

    public Order getOrderById(Long id) {
        return orderMapper.selectOrderById(id);
    }
}

2️⃣ 创建 Controller

com.example.demo.controller 包中创建一个 OrderController

java 复制代码
package com.example.demo.controller;

import com.example.demo.entity.Order;
import com.example.demo.service.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping("/orders/{id}")
    public Order getOrderById(@PathVariable Long id) {
        return orderService.getOrderById(id);
    }
}

🔧 步骤 7:测试读写分离

  1. 启动 Spring Boot 项目
bash 复制代码
mvn spring-boot:run
  1. 测试写操作(INSERT/UPDATE/DELETE)

通过 Navicat 或其他工具,向数据库执行写操作,确保这些操作路由到 主库

  1. 测试读操作(SELECT)

访问 http://localhost:8080/orders/{id} ,验证读操作是否路由到 从库


🔧 步骤 8:配置延迟检测

ProxySQL 中启用 延迟检测

sql 复制代码
SET mysql-monitor_replication_lag_interval_ms = 1000;

INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, check_type, max_replication_lag)
VALUES (10, 20, 'seconds_behind_master', 5);

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

总结

步骤 描述
安装 MyBatis-Flex 在项目中引入 MyBatis-Flex
配置数据源 application.yml 中配置 ProxySQL 的数据源
配置读写分离规则 在 ProxySQL 中配置读写分离规则
创建实体类、Mapper、Service、Controller 实现数据库访问逻辑
启用延迟检测 在 ProxySQL 中启用延迟检测
相关推荐
摇滚侠8 分钟前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
摇滚侠12 分钟前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
十年小站13 分钟前
一、新建一个SpringBoot3项目
java·spring boot
PFinal社区_南丞20 分钟前
构建可维护的正则表达式系统-pfinal-regex-center设计与实现
后端·php
Imnobody20 分钟前
吴恩达 Prompt 工程课精讲②:写出高可靠 Prompt 的2大黄金法则
后端
yuuki23323325 分钟前
【C语言】程序的编译和链接(基础向)
c语言·后端
梅小西爱学习29 分钟前
线上CPU飙到100%?别慌,这3个工具比top快10倍!
java·后端·cpu
radient38 分钟前
属于Agent的课本 - RAG
人工智能·后端·程序员
程序员阿达42 分钟前
开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
java·spring boot·后端
用户34216749055244 分钟前
鱼皮模拟面试,吊打面试官
后端