SpringBoot_第七章(读写分离)
这里列举了三种读写分离实现方案,分别是如下三种
1:MybatisPlus(读写分离)
1.1:首先创建三个数据库1主2从
表名是user表



1.2:代码实例
1:导入pom
<!--MybatisPlus的jar 3.0基于jdk8--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- mybatisPlus多数据源依赖 实现读写分离--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></dependency><!-- mysql的依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!--直接使用druid的starter 连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency>
2:配置spring的主从
server:port: 8082spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://localhost:3306/W1?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource #配置德鲁伊数据源druid:initial-size: 10 #连接池初始化大小min-idle: 10 #最小空闲连接数max-active: 20 #最大连接数slave_1:url: jdbc:mysql://localhost:3306/W1R1?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource #配置德鲁伊数据源druid:initial-size: 10 #连接池初始化大小min-idle: 10 #最小空闲连接数max-active: 20 #最大连接数slave_2:url: jdbc:mysql://localhost:3306/W1R2?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource #配置德鲁伊数据源druid:initial-size: 10 #连接池初始化大小min-idle: 10 #最小空闲连接数max-active: 20 #最大连接数#......省略#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
3:代码实例 @DS("slave") 注解用来切换数据源
/**
* @description 针对表【User】的数据库操作Service实现
* @createDate 2023-11-01 17:17:57
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{@ResourceUserMapper userMapper;//多个从库 负载均衡轮训查询 也可以注解到类上//@DS("slave")@DS("slave")public User selectRW_S(Integer id) {return userMapper.selectById(id);}//主库查询数据//@DS("master")@DS("master")public User selectRW_M(Integer id) {return userMapper.selectById(id);}//无注解,不指定数据, 默认查询主库@Overridepublic User selectRW(Integer id) {return userMapper.selectById(id);}
}
controller代码根据请求不同访问不同的数据源
@RestController
public class UserControllerRW {@ResourceUserServiceImpl userService;//查询主库 @DS("master")@GetMapping(value = "selectRW1")public User selectRW_M(@RequestParam(name = "id",required = true) Integer id){User user = userService.selectRW_M(id);System.out.println(user);return user;}//查询从库 @DS("slave") 轮训查询@GetMapping(value = "selectRW2")public User selectRW_S(@RequestParam(name = "id",required = true) Integer id){User user = userService.selectRW_S(id);System.out.println(user);return user;}//无注解,不指定数据, 默认查询主库@GetMapping(value = "selectRW3")public User selectRW(@RequestParam(name = "id",required = true) Integer id){User user = userService.selectRW(id);System.out.println(user);return user;}
}
查询结果截图



1.3:优缺点分析
dynamic-datasource的jar包的官方文档
基础必读(免费) · dynamic-datasource · 看云
本框架只做切换数据的事情,不限制你的具体操作,从库也可以增删改查,读写分离只是他的一个小功能,分库分表要自己实现
- 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
- 支持数据库敏感配置信息 加密(可自定义) ENC()。
- 支持每个数据库独立初始化表结构schema和数据库database。
- 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
- 支持 自定义注解 ,需继承DS(3.2.0+)。
- 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
- 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
- 提供 自定义数据源来源 方案(如全从数据库加载)。
- 提供项目启动后 动态增加移除数据源 方案。
- 提供Mybatis环境下的 纯读写分离 方案。
- 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
- 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供 基于seata的分布式事务方案 。
- 提供 本地多数据源事务方案。
2:SpringBoot路由数据源(读写分离)
3:
相关文章:
SpringBoot_第七章(读写分离)
这里列举了三种读写分离实现方案,分别是如下三种 1:MybatisPlus(读写分离) 1.1:首先创建三个数据库1主2从 表名是user表 1.2:代码实例 1:导入pom <!--MybatisPlus的jar 3.0基于jdk8--><depend…...
linux下mysql-8.2.0集群部署(python版本要在2.7以上)
目录 一、三台主机准备工作 1、mysql官方下载地址:https://dev.mysql.com/downloads/ 2、修改/etc/hosts 3、关闭防火墙 二、三台主机安装mysql-8.2.0 1、解压 2、下载相应配置 3、初始化mysql,启动myslq,设置开机自启 4、查看初始密…...
40 深度学习(四):卷积神经网络|深度可分离卷积|colab和kaggle的基础使用
文章目录 卷积神经网络为什么要卷积卷积的具体流程池化tensorflow代码 深度可分离卷积原理介绍计算量对比代码参数计算例子 colab 和 kagglecolabkaggle如何在colab上使用kaggle的数据 卷积神经网络 卷积神经网络的基本结构 1: (卷积层(可选)池化层) * N全连接层 *…...
Spring Boot面向切面加注解
一.项目pom.xml文件引入切面依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>二.定义注解类 import java.lang.annotation.*;/*** desc 错误日志注解* au…...
uniapp小程序授权统一处理
1.使用 1.将工具代码引入到utils中 const authorize (scope, isOne false, isMust false) > {if (!scope || !authorizeObj[scope]) {return console.error(请传输需要获取权限的 scope,详见,https://uniapp.dcloud.net.cn/api/other/authorize.html#scope-…...
光学仿真|优化汽车内部照明体验
当我们谈论优化人类感知的内部照明时,我们实际上指的是两个重点领域:安全性和驾驶员体验。如果内部照明可以提供尽可能最佳的体验,驾驶员则能够更好地应对颇具挑战性或意外的驾驶状况,并且减轻疲劳感。除了功能优势外,…...
Spring XML使用CASE WHEN处理SELECT字段
在日常开发中,经常会碰到需要导出的情况。而一些枚举值或者状态一般是定义成整型,这个时候需要对数据进行转换,转换成对应的文本再导出。 在XML中用CASE WHEN来根据不同的查询结果做不同的处理。 比如 SELECT name AS 姓名, age AS 年龄 C…...
关于C#中使用多线程的讨论
关于C#中使用多线程的讨论 C# 中 Thread 调用的函数有返回值 没有输入应该如何解决 如果你想在一个新的线程中调用一个带返回值但没有输入参数的函数,可以使用 Thread 类的委托 ThreadStart 来创建一个新的线程,并在其中调用该函数。然后,你可以使用 Thread 类的 Join 方法…...
工程机械数字孪生可视化平台建设,推动大型装备智能化数字化转型升级
随着信息技术的迅猛发展,数字孪生技术作为一项新兴技术应运而生。数字孪生是指通过数学模型和仿真技术,将实际物理对象与其数字化虚拟模型相互关联,实现对物理对象的全生命周期管理和智能优化。在工程机械领域,巨蟹数科从数字孪生…...
Linux 网络流量监控利器 iftop命令详解及实战
简介 iftop 是什么 在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf、nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具。 iftop 是 Linux 系统一个免费的网卡实时流量监控工具,类似于 top 命令…...
protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.8解决方案
php相关问题 安装程序提示以下内容 遇到某些php程序的安装提示: PHP script ‘/www/wwwroot/zhengban.youyacao.com/install/index.php’ is protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.8.1.lin’ to be installed. 1) Click her…...
KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(14)
接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(13) 上一回讲完了drivers/gpu/drm/drm_framebuffer.c中的framebuffer_check函数中的第一个for循环,本回继续讲解framebuffer_check()接下来的代码。为了便于理解,再次贴出其源码,如下所示: static …...
2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消
2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消 安装后,我们再打开终端,就会自动出现了(base) 就会出现这样子的,让人头大, 所以我们要解决它 具体原因是 安装了anac…...
Nginx搭载负载均衡及前端项目部署
目录 编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 编辑三.前端项目打包 编辑四.前端项目部署 1.上传项目…...
深度学习——炼丹
学习率调整策略 自定义学习率调整策略 简单版 net MyNet()optimoptim.Adam(net.parameters(),lr0.05) for param_group in optim.param_groups: param_group["lr"] param_group["lr"]*0.5print(param_group["lr"]) #0.25复杂版&#…...
Matlab中的app设计
1.窗口焦点问题: 窗口焦点问题:确保你的应用程序窗口正常处于焦点状态。有时,其他窗口的弹出或焦点切换可能导致应用程序最小化。点击应用程序窗口以确保它处于焦点状态。 窗口管理:确保你的 MATLAB 或操作系统没有未处理的错误或…...
曾经遇到过的无法解释的问题
因为不能直接展示生产数据与生产数据结构,所以写一个简单的例子 class Stu{ private String name; private int age; getter setter constructor 略 } List<Stu> list new ArrayList(); list.add(new Stu("s1",16)); list.add(new Stu("…...
基于uniapp与uview做一个按拼音首字母排序的通讯录页面
效果图: 第一步导入pinyin库并应用,用于区分汉字的拼音首字母 npm i pinyin import pinyin from "pinyin" 完整算法: function getListByPinyinFirstLetter(data) {const newList {};for (const item of data) {let firstLett…...
网络工程师-入门基础课:华为HCIA认证课程介绍
【微/信/公/众/号:厦门微思网络】 华为HCIA试听课程:超级实用,华为VRP系统文件详解 华为HCIA试听课程:不会传输层协议,HCIA都考不过 华为HCIA试听课程:网络工程师的基本功:网络地址转换NAT 一…...
玻色量子成功研制光量子计算专用光纤恒温控制设备——“量晷”
近日,北京玻色量子科技有限公司(以下简称“玻色量子”)成功研制出一款高精度量子计算专用光纤恒温控制设备——“量晷”,该设备能将光纤的温度变化稳定在千分之一摄氏度量级,即能够做到0.001C的温度稳定维持…...
Geoserver面图层Label标注优化:基于SLD的中心点标注策略
1. 为什么你的面图层标注总是重复出现? 第一次用Geoserver发布面图层时,很多人都会遇到这个头疼的问题:明明数据里每个面要素只有一个名称,为什么地图上却像复制粘贴一样出现密密麻麻的重复标注?这其实和Geoserver的瓦…...
ZenTimings:释放Ryzen平台内存潜力的专业调校工具
ZenTimings:释放Ryzen平台内存潜力的专业调校工具 【免费下载链接】ZenTimings 项目地址: https://gitcode.com/gh_mirrors/ze/ZenTimings 在AMD Ryzen平台的性能优化领域,内存时序调校常常被视为提升系统响应速度的"最后一块拼图"。然…...
Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校
Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...
AgentCPM研报助手:离线环境下的高效解决方案,保护数据隐私安全
AgentCPM研报助手:离线环境下的高效解决方案,保护数据隐私安全 1. 为什么需要离线研报生成工具 在金融分析、政策研究和商业咨询领域,研究报告的撰写往往面临两大核心挑战:一是处理敏感数据时的隐私安全问题,二是高强…...
vLLM-v0.17.1安全加固指南:防止提示词注入与滥用
vLLM-v0.17.1安全加固指南:防止提示词注入与滥用 1. 为什么需要安全加固 当你把vLLM服务公开部署到生产环境时,安全防护就不再是可选项。最近我们遇到一个真实案例:某企业未配置任何防护措施的大模型API,上线3天后就被恶意用户通…...
Qwen3.5-9B算法学习伙伴:LeetCode解题思路分析与代码实现
Qwen3.5-9B算法学习伙伴:LeetCode解题思路分析与代码实现 1. 为什么需要AI算法学习伙伴 刷LeetCode是每个程序员提升算法能力的必经之路,但独自面对难题时常常陷入困境。你可能遇到过这些情况:盯着题目半小时毫无头绪、写出的代码总是超时、…...
LY68L6400 SRAM的QSPI驱动优化:RT-Thread在STM32H743上的性能调优指南
LY68L6400 SRAM的QSPI驱动优化:RT-Thread在STM32H743上的性能调优指南 在嵌入式系统开发中,外部SRAM常被用作高速缓存或扩展内存,而QSPI接口因其高带宽特性成为连接SRAM的理想选择。LY68L6400作为一款64Mb的QSPI SRAM,在STM32H743…...
微信小程序私域直播的五大替代方案及成本效益分析
1. 微信小程序私域直播现状与挑战 去年6月腾讯突然关闭小程序直播功能申请的消息,让很多依赖微信生态的商家措手不及。我接触过不少做服装、美妆的客户,他们之前靠着小程序直播能轻松做到单场50万的销售额,功能关闭后业绩直接腰斩。现在商家们…...
OpenClaw研究助手:千问3.5-9B驱动的文献综述自动化
OpenClaw研究助手:千问3.5-9B驱动的文献综述自动化 1. 为什么需要自动化文献综述? 作为一位经常需要撰写文献综述的研究者,我深刻理解这个过程的痛苦。传统文献整理需要手动下载PDF、逐篇阅读、摘录关键观点、分类归档,最后再整…...
别再只盯着mAP了:用YOLO做项目时,TP/FP/FN这些指标到底该怎么看?
别再只盯着mAP了:用YOLO做项目时,TP/FP/FN这些指标到底该怎么看? 当你第一次看到YOLO模型的预测结果时,那些密密麻麻的边界框可能会让你感到既兴奋又困惑。兴奋的是模型确实检测到了目标,困惑的是——这些检测结果到底…...
