当前位置: 首页 > web >正文

Spring Boot + MyBatis-Plus 读写分离与多 Slave 负载均衡示例

Spring Boot + MyBatis-Plus 读写分离与多 Slave 负载均衡示例

一、项目结构

src/main/java/com/example/demo/
├── config/
│   ├── DataSourceConfig.java         # 数据源配置
│   ├── MyBatisPlusConfig.java        # MyBatis-Plus配置
├── constant/
│   ├── DataSourceType.java           # 数据源类型枚举
├── context/
│   ├── DataSourceContextHolder.java  # 数据源上下文
├── aspect/
│   ├── DataSourceAspect.java         # 注解驱动的数据源切换
│   ├── DataSourceRouteAspect.java    # 自动路由的数据源切换
├── annotation/
│   ├── DataSource.java               # 自定义数据源注解
├── loadbalancer/
│   ├── SlaveDataSourceLoadBalancer.java # 从库负载均衡器
├── mapper/
│   ├── UserMapper.java               # DAO接口
├── service/
│   ├── UserService.java              # 服务接口
│   ├── impl/
│       └── UserServiceImpl.java      # 服务实现
├── controller/
│   ├── UserController.java           # 控制器
└── DemoApplication.java              # 启动类

二、核心代码实现

(一)数据源类型枚举

// constant/DataSourceType.java
package com.example.demo.constant;public enum DataSourceType {MASTER,SLAVE_1,SLAVE_2,SLAVE_3
}

(二)数据源上下文

// context/DataSourceContextHolder.java
package com.example.demo.context;import com.example.demo.constant.DataSourceType;public class DataSourceContextHolder {private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();public static void setDataSource(DataSourceType type) {contextHolder.set(type);}public static DataSourceType getDataSource() {return contextHolder.get();}public static void clearDataSource() {contextHolder.remove();}
}

(三)动态数据源

// config/DynamicRoutingDataSource.java
package com.example.demo.config;import com.example.demo.context.DataSourceContextHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicRoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSource();}
}

(四)数据源配置

// config/DataSourceConfig.java
package com.example.demo.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.example.demo.constant.DataSourceType;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class DataSourceConfig {@Primary@Bean(name = "masterDataSource")@ConfigurationProperties("spring.datasource.master")public DataSource masterDataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave1DataSource")@ConfigurationProperties("spring.datasource.slave1")public DataSource slave1DataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave2DataSource")@ConfigurationProperties("spring.datasource.slave2")public DataSource slave2DataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave3DataSource")@ConfigurationProperties("spring.datasource.slave3")public DataSource slave3DataSource() {return DruidDataSourceBuilder.create().build();}@Beanpublic DataSource dynamicDataSource() {DynamicRoutingDataSource dynamicDataSource = new DynamicRoutingDataSource();// 设置默认数据源dynamicDataSource.setDefaultTargetDataSource(masterDataSource());// 设置多数据源映射Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DataSourceType.MASTER, masterDataSource());targetDataSources.put(
http://www.xdnf.cn/news/10803.html

相关文章:

  • MyBatis 执行 SQL 报错:String 无法转换为 Long 的排查与解决实录
  • 【Linux内核】设备模型之udev技术详解
  • Unity异常上报飞书工具
  • 如何计算H5页面加载时的白屏时间
  • llama.cpp:纯 C/C++ 实现的大语言模型推理引擎详解一
  • 快速上手pytest
  • Java求职者面试:Spring、Spring Boot、Spring MVC与MyBatis技术深度解析
  • Kerberos面试内容整理-在 Linux/Windows 中的 Kerberos 实践
  • WPS word 已有多级列表序号
  • 2025年微信小程序开发:趋势、最佳实践与AI整合
  • Linux下使用nmcli连接网络
  • win11中使用grep命令
  • 若依+vue2实现模拟登录
  • JavaSec | H2数据库注入学习
  • DeepSeek 赋能智能建筑:区块链能耗管理的破局与革新
  • go get下载三方库异常
  • 【设计模式-3.7】结构型——组合模式
  • 【208】VS2022 C++ 32位整数和unsigned char数组之间互相转换
  • 升级centos 7.9内核到 5.4.x
  • 更强劲,更高效:智源研究院开源轻量级超长视频理解模型Video-XL-2
  • ONLYOFFICE 与 LocalAI:在 Ubuntu 上搭建 AI 文档编辑环境
  • 法律大语言模型(Legal LLM)技术架构
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题
  • Stone 3D新版本发布,添加玩家控制和生物模拟等组件,增强路径编辑功能,优化材质编辑
  • 第3篇:数据库路由模块设计与 SQL 路由策略解析
  • 【IOS】GCD学习
  • centos中的ulimit命令
  • SpringCloud 分布式锁Redisson锁的重入性 高并发 获取锁
  • 「EN 18031」访问控制机制(ACM - 1):智能路由器的安全守卫
  • SuperMap GIS基础产品FAQ集锦(20250603)