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.pswp.cn/bicheng/83539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android binder(1)基本原理

一、IPC 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;机制&#xff0c;用于解决不同进程间的数据交互问题。 不同进程之间用户地址空间的变量和函数是不能相互访问的&#xff0c;但是不同进程的内核地址空间是相同和共享的&#xff0c;我们可…

高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”

一、高密爆炸&#xff1a;一声巨响&#xff0c;撕开化工安全“伤疤” 2025年5月27日&#xff0c;山东高密友道化学有限公司的车间爆炸声&#xff0c;像一把利刃划破了化工行业的平静。剧烈的冲击波将车间夷为平地&#xff0c;黑色蘑菇云腾空而起&#xff0c;刺鼻的化学气味弥漫…

双擎驱动:华为云数字人与DeepSeek大模型的智能交互升级方案

一、技术融合概述 华为云数字人 华为云数字人&#xff0c;全称&#xff1a;数字内容生产线 MetaStudio。数字内容生产线&#xff0c;提供数字人视频制作、视频直播、智能交互、企业代言等多种服务能力&#xff0c;使能千行百业降本增效。另外&#xff0c;数字内容生产线&#…

Linux运维笔记:1010实验室电脑资源规范使用指南

文章目录 一. 检查资源使用情况&#xff0c;避免冲突1. 检查在线用户2. 检查 CPU 使用情况3. 检查 GPU 使用情况4. 协作建议 二. 备份重要文件和数据三. 定期清理硬盘空间四. 退出 ThinLinc 时注销&#xff0c;释放内存五. 校外使用时配置 VPN注意事项 总结 实验室的电脑配备了…

手机邮箱APP操作

收发电子邮件方式 邮箱可以在网络段登录&#xff0c;也可以在手机端登录。 大学网络服务 收发电子邮件有三种方式&#xff1a; 1、Web方式&#xff1a; 1&#xff09;登录“网络服务”&#xff08;https://its.pku.edu.cn&#xff09;&#xff0c;点页面顶端“邮箱”。 2&…

Dockerfile 使用多阶段构建(build 阶段 → release 阶段)后端配置

错误Dockerfile配置示例&#xff1a; FROM python:3.11 as buildENV http_proxyhttp://172.17.0.1:7890 ENV https_proxyhttp://172.17.0.1:7890WORKDIR /appENV PYTHONPATH/app# Install Poetry # RUN curl -sSL https://install.python-poetry.org | POETRY_HOME/opt/poetry…

webstrom中git插件勾选提交部分文件时却出现提交全部问题怎么解决

原因是我有个.husky的文件制定了执行提交的时候就是提交所有的文件 修改.husky/pre-commit文件就可以啦 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"# 获取通过 WebStorm 提交的暂存文件&#xff08;仅勾选的部分&#xff09; STAGED_FILES$(gi…

OSG编译wasm尝试

最近遇到一个情况&#xff0c;需要尝试一下OSG到webassembly 发现官网有教程 于是顺着看了看&#xff0c;默认教程是xubuntu的一个系统跑的&#xff0c;但是我本着试一试的想法&#xff0c;拉下来直接在windows上跑&#xff0c;奇奇怪怪的报错简直头皮发麻 然后怎么办呢&#x…

QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现

目录 QT中子线程触发主线程弹窗并阻塞等待用户响应传统信号槽实现实现思路具体步骤1. 定义信号与槽2. 异步任务中触发弹窗3. 主线程处理弹窗4. 连接信号与槽关键点总结 更简单实现 QT中子线程触发主线程弹窗并阻塞等待用户响应 传统信号槽实现 场景需求&#xff1a;在子线程执…

STM32学习之WWDG(原理+实操)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【端午安康】龙舟争渡Plug-In

文章目录 正文附录A&#xff1a;关于Python的录屏方法总结&#xff08;来自DeepSeek的回答&#xff09;1. 使用 pyautogui 和 OpenCV 录制屏幕2. 使用 mss 库&#xff08;高效屏幕捕获&#xff09;3. 使用 PIL.ImageGrab 录制屏幕4. 使用 Windows 原生快捷键录制&#xff08;非…

Apache SeaTunnel部署技术详解:模式选择、技巧与最佳实践

Apache SeaTunnel(原Waterdrop)作为高性能、分布式数据集成平台,支持海量数据的离线与实时同步。其灵活多样的部署模式可适配不同规模的生产环境需求。本文将系统解析SeaTunnel的部署架构、技术要点及最佳实践,帮助用户高效构建稳定可靠的数据管道。 一、部署模式全景概览 …

【机械视觉】Halcon—【六、交集并集差集和仿射变换】

【机械视觉】Halcon—【六、交集并集差集和仿射变换】 目录 【机械视觉】Halcon—【六、交集并集差集和仿射变换】 介绍 交集并集差集介绍: 1. 交集&#xff08;Intersection&#xff09; 2. 并集&#xff08;Union&#xff09; 3. 差集&#xff08;Difference&#xff…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.6 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.6 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图&#xff0c;等值线图。 dataframe <-data.frame…

剑指offer15_数值的整数次方

数值的整数次方 实现函数 double Power(double base, int exponent) 题目要求 计算 base exponent \text{base}^{\text{exponent}} baseexponent&#xff1a; 不得使用库函数不需要考虑大数问题&#xff0c;绝对误差不超过 10 − 2 10^{-2} 10−2不会出现底数和指数同为 0…

【Typst】1.Typst概述

概述 Typst是一种用于排版文档的标记语言&#xff0c;可以用于排版各种精美的论文、文章、书籍、报告和作业等。它是LaTex的精神续作&#xff0c;但是运行环境和编译速度都要更简单、更快捷。 它设计了一种脚本结合简单的标记语法实现复杂的排版效果。并且支持模板创建、文件…

[Java恶补day14] 56. 合并区间

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3…

DiskGenius专业版v6.0.1.1645:分区管理、数据恢复、备份还原,一应俱全!

各位小伙伴&#xff0c;大家好&#xff01;今天阿灿给大家带来一款超好用的分区工具&#xff0c;DiskGenius专业版。这款工具堪称电脑管理界的“瑞士军刀”&#xff0c;功能强大&#xff0c;现在出了新版本v6.0.1.1645&#xff0c;简繁中文单文件便携版&#xff0c;使用超方便。…

azure web app创建分步指南系列之二

为注册表授权托管标识 你创建的托管标识尚未获得从容器注册表中提取数据的授权。在此步骤中,你将启用授权。 返回容器注册表的管理页面: 在左侧导航菜单中,选择“访问控制 (IAM)”。选择“添加角色分配”。此屏幕截图显示了如何为容器注册表启用添加角色分配。在角色列表中…

STM32 AD单通道与多通道实战指南

文章目录 AD单通道&#xff08;实验&#xff09;有关配置的库函数AD单通道部分主要代码 AD多通道实现多通道采集实现思路探讨单次转换非扫描模式实现AD多通道AD多通道部分代码 学习建议&#xff1a;推荐搭配 江协科技 AD单通道 AD多通道一起食用&#xff01;&#xff01;&#…