基础组件-对Mybatis返回条数限制

一、目的
     限制单条SQL从数据库、拉取过多数据到应用端,防止应用内存过高,数据库IO过高等问题
二、开启限制
     加入该特性,只要引用基础框架包自动加入限制,限制数据量默认为1w条
三、关闭限制
     如果需要关闭该特新,在配置文件设置该属性,并重启
     -----properties---------------
     #关闭、默认开始
     sc.mybatis.plugin.enabled=false
    -----properties---------------
四、修改限制数量
     -----properties---------------
     #关闭、默认开始
     sc.mybatis.plugin.max.rows=10000
    -----properties---------------
五、升级优化
    异常抛出策略,在超出限制条数的时候可以选择抛出异常
     -----properties---------------
     #关闭、默认false
     sc.mybatis.plugin.throw.exception=false
    -----properties---------------
六、开发规范
    单条SQL数据量过大建议使用分页查询,减轻数据库和应用压力,避免内存溢出
七、实现原理
    通过mybatis拦截器,拦截StatementHandler,给Statement设置maxRows实现
核心代码:

@Slf4j
@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})})
public class SQLStatementHandlerInterceptor implements Interceptor {/*** 限制返回条数** @param invocation* @return* @throws Throwable*/private int maxRows;public SQLStatementHandlerInterceptor(int maxRows) {this.maxRows = maxRows;}@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object[] args = invocation.getArgs();if (null != args && args.length > 0) {try {if (maxRows > 0) {Statement statement = (Statement) args[0];statement.setMaxRows(maxRows);} else {// 小于0,不做处理,默认取所有数据}} catch (SQLException e) {log.error("不支持设置maxRows");}}return invocation.proceed();}public int getMaxRows() {return maxRows;}public void setMaxRows(int maxRows) {this.maxRows = maxRows;}
}

抛出异常核心代码:

@Slf4j
@Intercepts({@Signature(type = ResultHandler.class, method = "handleResultSets", args = {Statement.class})})
public class ResultHandlerInterceptor implements Interceptor {/*** Apollo配置限制返回条数** @param invocation* @return* @throws Throwable*/@Value("${sc.mybatis.plugin.max.rows:10000}")private int maxRows;/*** apollo配置是否抛出异常*/@Value("${sc.mybatis.plugin.throw.exception:false}")private boolean throwException;public ResultHandlerInterceptor(int maxRows) {this.maxRows = maxRows;}@Overridepublic Object intercept(Invocation invocation) throws Throwable {List result = (List) invocation.proceed();if(CollectionUtils.isEmpty(result)){return  null;}// 不走限制逻辑if(maxRows < 0){return result;}// 超出限制,抛出异常int size = result.size();if(size > maxRows){if(throwException){log.error("数据库单条SQL查询超出框架包mybatis限制,并且抛出异常,可以关闭mybatis限制功能或者修改限制条数或者关闭异常");throw new RuntimeException("数据库查询超时mybatis插件限制maxRows="+maxRows);}else {if(size -1 >0){result = result.subList(0,size -1);}}}return result;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172076.shtml

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

相关文章

MYSQL基础之【正则表达式,事务处理】

文章目录 前言MySQL 正则表达式MySQL 事务事务控制语句事务处理方法PHP中使用事务实例 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不…

文档向量化工具(二):text2vec介绍

目录 前言 text2vec开源项目 核心能力 文本向量表示模型 本地试用 安装依赖 下载模型到本地&#xff08;如果你的网络能直接从huggingface上拉取文件&#xff0c;可跳过&#xff09; ​运行试验代码 前言 在上一篇文章中介绍了&#xff0c;如何从不同格式的文件里提取…

哈希桶底层中用iterator初始化const_iterator迭代器

template<class T,class Ref,class Ptr> struct Iterator {typedef Iterator<T,Ref,Ptr> Self;typedef Iterator<T, T*, T&>iterator;Iterator(T a):_a(a){printf("构造函数");}Iterator( iterator& it):_a(it._a){printf("拷贝构造函…

4.整数输入,并输出变量类型【2023.11.26】

1.问题描述 使用 input 函数读入一个整数&#xff0c;并将该整数输出&#xff0c;并在下一行输出变量类型 2.解决思路 使用 type 函数获取变量类型 输入的内容从 input() 函数获取时&#xff0c;它们是字符串类型。但是&#xff0c;我们需要将其转换为整数类型&#xff0c;以…

Unity-类-Vector

Vector矢量 是一个基本的数学概念,它允许你描述方向和大小。在游戏和应用中,矢量通常用于描述一些基本属性,如角色的位置、物体移动的速度或两个物体之间的距离。 矢量算术是计算机编程很多方面(如图形、物理和动画)的基础,深入了解这一主题对于充分发挥 Unity 的功能很有…

【STM32单片机】自动售货机控制系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用OLED显示模块、矩阵按键模块、LED和蜂鸣器、继电器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示系统初始界面&#xff0c;可通过…

JavaEE进阶学习:读取和存储对象

到了学习 JavaEE 这块要有一个思想,实现一个功能的时候,先考虑下有没有实现对应功能的注解. 在 Spring 中想要更简单的存储和读取对象的核心是使用注解&#xff0c;也就是我们接下来要学习 Spring 中的相关注解&#xff0c;来存储和读取 Bean 对象 1.存储 Bean 对象 之前我们…

跟着chatgpt一起学|1.spark入门之MLLib

chatgpt在这一章表现的不好&#xff0c;所以我主要用它来帮我翻译文章提炼信息 1.前言 首先找到spark官网里关于MLLib的链接 spark内一共有2种支持机器学习的包&#xff0c; 一种是spark.ml,基于DataFrame的&#xff0c;也是目前主流的 另一种则是spark.mllib,是基于RDD的…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

乘法原理 LeetCode 828. 统计子串中的唯一字符

我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s "LEETCODE" &#xff0c;则其中 "L", "T","C","O","D" 都是唯一字符&#xff0c;…

【PTA题目】7-13 梅森数 分数 20

7-13 梅森数 分数 20 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 形如2n−1的素数称为梅森数&#xff08;Mersenne Number&#xff09;。例如22−13、23−17都是梅森数。1722年&#xff0c;双目失明的瑞士数学大师欧拉证明了231−12147483647是一个素数&#xff0…

坚鹏:广州银行清华大学消费金融发展趋势与创新培训圆满结束

广州银行自1996年9月成立以来&#xff0c;依托中国经济腾飞的大好形势&#xff0c;成为国内具有一定知名度与地方特色的商业银行。截至2022年12月末&#xff0c;已开业机构174家&#xff0c;包括总行1家&#xff0c;分行级机构15家(含信用卡中心)、支行152家、信用卡分中心6家&…

通达信视频教程的下载地址

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/12yNV62ROERRzmyqm9u22aQ?pwdgmdx

2023-11-26 事业-代号s-跨境物流-记录

摘要: 2023-11-26 事业-代号s-跨境物流-记录 跨境物流: 【结论】 中小卖家&#xff08;最低适合1个人经营的卖家&#xff09;首选以下两种物流&#xff0c;目前已知的是以下两种&#xff0c;后续有新的发现再更新。 1、云途物流&#xff08;YunExpress&#xff09;&#xff…

【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流

文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆&#xff0c;成功带火了AIGC&#xff0c;让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…

线性模型加上正则化

使用弹性网络回归&#xff08;Elastic Net Regression&#xff09;算法来预测波士顿房屋价格。弹性网络回归是一种结合了L1和L2正则化惩罚的线性回归模型&#xff0c;能够处理高维数据和具有多重共线性的特征。弹性网络回归的目标函数包括数据拟合损失和正则化项&#xff1a; m…

【Qt开发流程】之拖放操作1:介绍

描述 Drag and drop 提供了一种简单的可视化机制&#xff0c;用户可以使用它在应用程序之间和应用程序内部传输信息。拖放的功能类似于剪贴板的剪切和粘贴机制。 本文描述了基本的拖放机制&#xff0c;并概述了在自定义控件中启用该机制的方法。Qt的许多控件也支持拖放操作&a…

torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:

批量归一化是一种加速神经网络训练和提升模型泛化能力的技术。它对每个特征维度进行标准化处理&#xff0c;即调整每个特征的均值和标准差&#xff0c;使得它们的分布更加稳定。 Batch Norm主要是为了让输入在激活函数的敏感区。所以BatchNorm层要加在激活函数前面。 1.torch.…

如何用低代码的思路设计文字描边渐变组件

前言 文字特效设计一直是困扰 Web 前端 Css 世界多年的问题, 比如如何用纯 Css 实现文字描边, 渐变, 阴影等, 由于受限于浏览器兼容性的问题, 我们不得不使用其他替代方案来实现. 平时工作中我们使用 PS 等设计工具能很容易的实现文字渐变等特效, 但是随着可视化技术的成熟, 我…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…