Mybatis-plus 大数据量数据流式查询通用接口

文章目录

          • 一、案例需求
          • 二、使用案例:
            • 2.1. 自定义查询接口
            • 2.2. 逻辑处理类
            • 2.3. 调用案例
            • 2.4. 具体逻辑处理案例
          • 三、企业案例
            • 3.1. key名称获取
            • 3.2. 逻辑类测试
            • 3.3.最后一个批次处理方案
          • 四、 通用SQL预编译处理
            • 4.1. 业务场景
            • 4.2. xml形式
            • 4.3. 注解形式
          • 五、企业案例
            • 5.1. sql语句
            • 5.2. 大数据流查询接口
            • 5.3. 大数据查询结果集处理抽象类
            • 5.4. 服务接口
            • 5.5. 服务接口实现类
            • 5.6. 前端控制器

声明:
大数据流查询解决查询结果集过大的导致内存溢出的问题。
针对查询通用SQL与数据交互的次数加到数据库压力,要使用预编译。

一、案例需求

查询sys_user表中的所有数据,数据库中供3条数据,在实际处理类中我设置了具体处理批次的数量为2条数据为一个批次,那么一个批次就只处理2条数据,处理完成后,继续处理下一个批次(2条数据),直至全部处理完成。

大病项目案例:数据库查询1次查询数量为1000条,在实际的逻辑处理中,我设置了本次批次处理的数据数量为500条,那一个批次就只处理500条,处理完第1个批次500条后,在处理下一次批次的500条。

注:

  1. 这个根据实际情况动态设置
  2. 项目中默认1000条查询数据库一次(开发者可忽略)

设计初衷:
为了让大家都按照规范去做,因此抽象此接口,具体实现类去继承,获取对应的实体对象,然后一一获取里面的对象。

局限性:
当在一个类中获取的对象不只是一个,此抽象接口不能使用,需要单独的在自己的实现类中,按照此方式手写对用的mapper,待补充

二、使用案例:
2.1. 自定义查询接口

声明接口作用:只是为了听过一个接口供外部调用服务

package com.gblfy.ly.service;public interface ISDQueryResulService {public void batchSDHandle();
}

在这里插入图片描述
注:如果外部不需要调用,此接口可以省略,实现类可不实现此接口

2.2. 逻辑处理类
  • 1>继承extends SDQueryResultHandler重新handle方法,实现自己定义的接口
  • 2>注入SDQueryWrapper接口
    案例处理类路径:
com.gblfy.ly.service.impl. SDQueryResulServiceImpl

如下图所示:
在这里插入图片描述

2.3. 调用案例
1.自定义SQL语句
2.new 本身逻辑处理类
3.设置具体处理的批次数据数量
4.new 好的处理类变量名,放到此方法内部
5.调用lastSDHandle方法注:具体使用请参考,案例代码,已上传gitlab仓库

在这里插入图片描述

2.4. 具体逻辑处理案例

声明:查询批次的结果集最终返回的数据是一个list,大家只需要对list中的数据进行循环遍历,根据key获取处理对应的value即可。
在这里插入图片描述

三、企业案例

参数获取方式:根据key获取value,简言之,查询出来的数据放到了map中。

3.1. key名称获取
  1. 找到此类com.gblfy.ly.config. SDQueryResultHandler
  2. 在31行和32行打上断点
  3. debug启动项目
  4. url请求http://localhost/batchSDHandle
  5. 进项目,断点跳到32行

所有的key和value就都展示了出来
如下图所示:

在这里插入图片描述

3.2. 逻辑类测试

在com.gblfy.ly.service.impl. SDQueryResulServiceImpl类的35行打上断点,满足一个批次的数量就会跳到handle此方法中
在这里插入图片描述
在这里插入图片描述
注:数据库一共5条数据。

3.3.最后一个批次处理方案

从开始到结束,按照批次依次执行到最后一个批次,会自动调用lastSDHandle方法,因此,我们只需要处理好handle()方法即可。
最后,把获取的数据进行处理根据实际需求自行处理。
在这里插入图片描述

四、 通用SQL预编译处理
4.1. 业务场景

相同SQL和数据库交互多次,请按照规范适应预编译处理。

4.2. xml形式

在xml文件中添加statementType="PREPARED"即属性可
在这里插入图片描述

4.3. 注解形式
statementType = StatementType.PREPARED

在这里插入图片描述

五、企业案例
5.1. sql语句
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '主键ID',`name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',`age` int(11) DEFAULT NULL COMMENT '年龄',`email` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'Jone', '18', 'test1@baomidou.com');
INSERT INTO `user` VALUES ('2', 'Jack', '20', 'test2@baomidou.com');
INSERT INTO `user` VALUES ('3', 'Tom', '28', 'test3@baomidou.com');
INSERT INTO `user` VALUES ('4', 'Sandy', '21', 'test4@baomidou.com');
INSERT INTO `user` VALUES ('5', 'Billie', '24', 'test5@baomidou.com');
5.2. 大数据流查询接口
package com.gblfy.ly.mapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.gblfy.ly.entity.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.ResultSetType;
import org.apache.ibatis.mapping.StatementType;
import org.apache.ibatis.session.ResultHandler;import java.util.Map;/*** 处理流数据的公用接口** @author gblfy* @date 2020-11-18*/
@Mapper
public interface SDQueryWrapper {/*** ResultSetType.FORWARD_ONLY 表示游标只向前滚动* fetchSize 每次查询數量* @ResultTyp 定义返回的对象类型** @param sql  SQL語句* @param handler  返回处理数据对象*/@Select("${sql}")@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)@ResultType(Map.class)void streamDataDynamicHandle(@Param("sql") String sql, ResultHandler<Map> handler);@Select("${sql}")@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 2)@ResultType(User.class)void dynamicSelectLargeData1(@Param("sql") String sql, ResultHandler<User> handler);@Select("select * from user t ${ew.customSqlSegment}")@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000,statementType = StatementType.PREPARED)@ResultType(User.class)void getOrgWithBigData(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, ResultHandler<User> handler);
}
5.3. 大数据查询结果集处理抽象类
package com.gblfy.ly.config;import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 大数据查询结果集处理抽象类** @author gblfy* @date 2020-11-18*/
public abstract class SDQueryResultHandler implements ResultHandler<Map> {private final static Logger logger = LoggerFactory.getLogger(SDQueryResultHandler.class);// 这是每一个批处理查询的数量public  int batchSize = 1000;//初始值public int size=0;// 存储每批数据的临时容器public List<Map> list = new ArrayList<Map>();public void handleResult(ResultContext<? extends Map> resultContext) {// 这里获取流式查询每次返回的单条结果Map map = resultContext.getResultObject();list.add(map);size++;if (size == batchSize) {logger.info("本批次处理数据量 :{}",size );handle();}}// 1.这个方需要子类重写此接口,处理具体业务逻辑public abstract void handle();//处理最后一批不到 batchSize(查询设定的阀值)的数据public void lastSDHandle() {logger.info("最后批次处理数据量 :{}",size );handle();}public void setBatchSize(int batchSize) {this.batchSize = batchSize;}
}
5.4. 服务接口
package com.gblfy.ly.service;public interface ISDQueryResulService {public void batchSDHandle();
}
5.5. 服务接口实现类
package com.gblfy.ly.service.impl;import com.gblfy.ly.config.SDQueryResultHandler;
import com.gblfy.ly.mapper.SDQueryWrapper;
import com.gblfy.ly.service.ISDQueryResulService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service
public class SDQueryResulServiceImpl extends SDQueryResultHandler implements ISDQueryResulService {private final static Logger logger = LoggerFactory.getLogger(SDQueryResulServiceImpl.class);@Resourceprivate SDQueryWrapper sdQueryWrapper;@Overridepublic void batchSDHandle() {String sql = "select * from user";SDQueryResulServiceImpl sdQueryResulService = new SDQueryResulServiceImpl();sdQueryResulService.setBatchSize(2);//批量处理数据量  根据实际情况设置//1.按批次处理查询结果集数据sdQueryWrapper.streamDataDynamicHandle(sql,sdQueryResulService);//2.处理最后一个批次的查询结果数据sdQueryResulService.lastSDHandle();}// 在这里可以对你获取到的批量结果数据进行需要的业务处理@Overridepublic void handle() {try {logger.info("---------------------:{}",list.size());//list 批量查询结果集,对此list进行业务处理for (int i = 0; i < list.size(); i++) {logger.info("---------------------:{}",list.get(i).get("name"));}} finally {// 处理完每批数据后后将临时清空size = 0;list.clear();}}
}
5.6. 前端控制器
package com.gblfy.ly.controller;import com.gblfy.ly.service.ISDQueryResulService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SDQueryResultController {@Autowiredprivate ISDQueryResulService isdQueryResulService;@GetMapping("/batchSDHandle")public void batchSDHandle() {isdQueryResulService.batchSDHandle();}
}

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

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

相关文章

基于MaxCompute的数仓数据质量管理

声明 本文中介绍的非功能性规范均为建议性规范&#xff0c;产品功能无强制&#xff0c;仅供指导。 参考文献 《大数据之路——阿里巴巴大数据实践》——阿里巴巴数据技术及产品部 著。 背景及目的 数据对一个企业来说已经是一项重要的资产&#xff0c;既然是资产&#xff…

IP应用加速 – DCDN迈入全栈新篇章

4月11日&#xff0c;第七届"亚太内容分发大会"暨CDN峰会国际论坛中&#xff0c;阿里云资深技术专家姚伟斌发布了DCDN子产品IP应用加速&#xff08;IPA&#xff09;。IPA是基于阿里云CDN本身的资源优化&#xff0c;对传输层&#xff08;TCP&UDP&#xff09;协议进…

十年磨一剑,王坚自研的MaxCompute如何解决世界级算力难题

大数据时代&#xff0c;随着企业数据规模的急剧增长&#xff0c;传统软件已无法承载&#xff0c;这也推动了大数据技术的发展&#xff0c;Google、AWS、微软等硅谷巨头纷纷投入大数据技术的研发&#xff1b;而在国内&#xff0c;王坚也在十年前带领阿里云团队研发MaxCompute&am…

matlab和robotstudio,MATLAB与Robotstudio建立socket通信(初探)

前记:听一首《不想病》&#xff0c;歌词唱开头&#xff1a;做什么都不对&#xff0c;说什么都浪费&#xff0c;想什么我都可悲....&#xff1b;感觉就是不一样&#xff0c;好歌&#xff01;哎&#xff0c;&#xff0c;&#xff0c;回到正题。好多事要去做&#xff0c;还得挤时间…

贾扬清:我对人工智能方向的一点浅见

阿里妹导读&#xff1a;作为 AI 大神&#xff0c;贾扬清让人印象深刻的可能是他写的AI框架Caffe &#xff0c;那已经是六年前的事了。经过多年的沉淀&#xff0c;成为“阿里新人”的他&#xff0c;对人工智能又有何看法&#xff1f;最近&#xff0c;贾扬清在阿里内部分享了他的…

Node.js 应用故障排查手册 —— 类死循环导致进程阻塞

类死循环导致进程阻塞 楔子 在实践篇一中我们看到了两个表象都是和 CPU 相关的生产问题&#xff0c;它们基本也是我们在线上可能遇到的这一类问题的典型案例&#xff0c;而实际上这两个案例也存在一个共同点&#xff1a;我们可以通过 Node.js 性能平台 导出进程对应的 CPU Pro…

如何使用5个Python库管理大数据?

来源 | medium编译 | 武明利责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;如今&#xff0c;Python真是无处不在。尽管许多看门人争辩说&#xff0c;如果他们不使用比Python更难的语言编写代码&#xff0c;那么一个人是否真是软件开发人员&…

如何把创建ECS(CreateInstance)作为触发器来触发函数计算

问题描述 函数计算虽然不支持直接集成到ECS的管控事件上&#xff0c;但是函数计算本身是支持日志服务作为触发器的。即可以配置日志服务中logstore里的增强日志作为触发器来触发函数计算服务中的函数&#xff0c;同时可以传递project 和 logstore的name以及beginCursor/endCur…

ORACLE添加字段、删除字段

文章目录1. 删除表2. 创建表3. 添加字段4. 删除指定字段5. 修改指定字段长度1. 删除表 DROP TABLE SYS_JOB;2. 创建表 -- CREATE TABLE CREATE TABLE SYS_JOB (JOB_ID NUMBER(30) NOT NULL,JOB_NAME VARCHAR2(30) NOT NULL ); ALTER TABLE SYS_JOB ADD CONSTRA…

像数据科学家一样思考:12步指南(中)

像数据科学家一样思考&#xff1a;12步指南&#xff08;上&#xff09;《像数据科学家一样思考》 7-工程产品 下一步是建立统计软件。如果统计是分析和从数据中得出结论的框架&#xff0c;那么软件就是将这个框架付诸行动的工具。数据科学家必须为任何项目做出许多软件选择。如…

2020云计算,是四强争霸还是赢家通吃?

来源 | 架构师技术联盟责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;近日&#xff0c;谷歌母公司Alphabet首次公布了谷歌云计算业务的数据&#xff0c;这一举动将云计算行业重新推到了聚光灯下。众所周知&#xff0c;全球云市场竞争激烈&…

加载程序中数据库账号密码加密策略wallet_04

文章目录1. 切换到oracle用户2. 创建wallet目录3. 创建wallet 账户4. 查看创建的wallet5. 创建wallet目录6. 查看证书7. 把证书拷贝到客户端8. 在客户端的sqlnet.ora里添加9. 客户端的tnsnames.ora10. 测试登陆11. oracle环境变量oracle服务端创建wallet 1. 切换到oracle用户 …

利用丁香园数据生成疫情分布地图(R语言)| 博文精选

来源 | CSDN 博客作者 | 万里写入胸怀间责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;疫情牵动大家&#xff0c;除了做好分内工作&#xff0c;管好自己不给社会添乱&#xff0c;也就是只能持续关注疫情了。现在各大门户平台都上线了疫情实时地…

php连接数据库性能测试,无需安装配置,多操作系统支持数据库及性能测试

iBoxDB是一个NoSQL数据库, 有SQLite的特性,但拥有更强大的Replication功能,支持更多的数据类型,自动完成ORMSQLite是全球知名度Top 10的数据库之一, 在文章 中对 SQLite 与 MySQL进行了一个事务中1万次插入测试, 测试的结果是"sqlite3用时仅0.4s,mysql用时2.2s"iBoxD…

ORACLE 添加和查看注释

文章目录一、表二、字段一、表 #1.给表加注释 COMMENT ON TABLE SYS_JOB IS 任务调度表;#2.查看表的COMMENT SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAMETABLENAME; 例如&#xff1a; SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAMESYS_JOB;二、字段 # 1.给字段加…

一次开发、多端分发,阿里巴巴发布AliOS车载小程序

4月16日上海国际车展首日&#xff0c;阿里巴巴小程序有了新动态&#xff1a;正在研发基于AliOS的车载小程序。 AliOS展出车载小程序、AI HUD、AI驾驶舱等最新技术 作为阿里巴巴小程序在车载场景的重要延伸&#xff0c;AliOS车载小程序和支付宝、高德等小程序一样&#xff0c;将…

基于TableStore的海量气象格点数据解决方案实战

前言 气象数据是一类典型的大数据&#xff0c;具有数据量大、时效性高、数据种类丰富等特点。气象数据中大量的数据是时空数据&#xff0c;记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量&#xff0c;每天产生的数据量常在几十TB到上百TB的规模&#xff0c;且在…

腾讯会议扩容背后:100万核计算资源全由自研服务器星星海支撑

疫情期间&#xff0c;远程会议及协同办公需求暴增。从1月29日开始到2月6日&#xff0c;腾讯会议每天都在进行资源扩容&#xff0c;日均扩容云主机接近1.5万台&#xff0c;8天总共扩容超过10万台云主机&#xff0c;共涉及超百万核的计算资源投入。 值得一提的是&#xff0c;腾讯…

实时计算无线数据分析

本文为您介绍实时计算在无线数据分析中的应用。阿里云实时计算可以为无线App的数据分析场景实时化助力&#xff0c;帮助您做到实时化分析手机AP的各项指标&#xff0c;包括App版本分布情况、Crash检测和等。 阿里云移动数据分析 (Mobile Analytics&#xff0c;下面简称MAN) 是…