《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景:

        在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。

        因为要写入csv文件,涉及到文件的输出流。

        之前讨论针对的解决方案:
        1、分页
        2、流式数据读取加工


技术栈选择-原因(个人理解)

分页:

        1、分页查询涉及到查询的效率

        2、并且也存在内存问题,只是将一个大的内存改变成了小的任务

流式:

        流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。

阿丹:所以直接使用流式查询直接一步到位。

实践!:

        第一次尝试:

        第一次尝试失败告终。

        使用了单纯的流式查询,确实对于内存比较友好,但是出现问题为。

因为是流式的读取导致处理的速度太慢,并且因为是流式读取在大数据集的情况下有时间效率非常低。所以还是有点鸡肋的。

        所以尝试看能不能在流式处理的过程中也考虑一下使用异步的方式多任务并行来处理。那么久涉及到了分页。于是有方案二。

第二次方式:

首先先解释一下流式查询是如何使用的:
我会将代码和逻辑展示出来其实逻辑还是比较简单的

流式查询使用:

 //流式
        dorisMapper.dorisjdbExportDownSQL(recordId,cDates,userId,saleIds,userName,taskId,status,sendMode,productId,checkTask,beginTime,endTime,parent,intercept,phoneCount,title,attribution_up,offset,limit,new ResultHandler<SmsDownEn>(){
            /**
             * 处理回调逻辑
             */
            @Override
            public void handleResult(ResultContext<? extends SmsDownEn> resultContext){
                resultContext.getResultObject()//这里就可以获得数据对象
                }
            }
        });

 解释:这里的handleResult为拿到的数据的指针也是拿到数据的回调函数,我们可以在这里来将数据一条一条拿出来并加工。

重点1:需要将整个流式读取使用数据库的事件来限制
StopWatch watch = new StopWatch();
        watch.start();
/**
*这里写流式读取的代码块
*/
watch.stop();
重点2:mapper的xml中写法配置
一、构建映射resultmap

在指定resultmap的时候一定注意实体类的位置,要映射正确

二、查询语句添加配置

在MyBatis框架中,resultSetType属性用于配置结果集的读取方式。对于给出的 <select> 标签中的 resultSetType="FORWARD_ONLY" 配置:

  • "FORWARD_ONLY" 表示结果集是只进向前类型的,也就是只能从前往后读取一次,不支持滚动和回溯操作。这是JDBC ResultSet默认的行为。

然而,这并不是配置流式读取(Streaming)的属性。MyBatis本身并不直接支持完全意义上的流式处理数据,因为它的设计目标更多在于将数据库查询结果映射到对象模型上。

若想实现类似流式读取的效果以提高大数据量下的内存效率,可以采用分页查询、延迟加载或者结合自定义的数据读取策略来避免一次性加载大量数据导致内存溢出。在某些特定场景下,可以通过逐行处理数据并及时释放资源的方式达到类似流式处理的目的,但这通常需要在具体的业务代码逻辑中进行控制和优化。

重点3:mapper中接口的方法携带必要参数

这个是必要的携带参数,其中的泛型类写成要映射的就可以了。

ResultHandler<SmsDownEn> resultHandler 这个是一个参数

并且注意在mapper的接口层面的时候,这个方法是没有返回值的,因为我们获取数据是从

resultContext中拿的所以不需要返回值。

展示一下接口代码:

这个参数是必须要带的,如果需要其他的条件查询等,和基础的一样直接在这里添加参数就可以了。

重点4:接口方法的使用

先看代码:

StopWatch watch = new StopWatch();
watch.start();

// 调用dorisMapper中的dorisjdbExportDownSQL方法并传入自定义的ResultHandler实现类
dorisMapper.dorisjdbExportDownSQL(new ResultHandler<SmsDownEn>() {
    /**
     * 处理回调逻辑
     */
    @Override
    public void handleResult(ResultContext<? extends SmsDownEn> resultContext) {
        // 在这里获取并处理每一条查询结果
        SmsDownEn smsDownEn = resultContext.getResultObject();

        // 根据实际业务需求对smsDownEn进行处理
        // ...
        
        // 例如简单的打印处理
        System.out.println(smsDownEn);
    }
});

// 停止计时器
watch.stop();

解释:

其实就是在参数中直接new ResultHandler并重写handleResult方法。

使用resultContext获取流式的返回值上下文。

至此流式结束。

第二版逻辑说明:

1、先使用sql使用相同的导出条件来完成返回需要导出多少条数据

2、计算导出数据的分页信息,可以通过固定一个文件多少条数据的方式。通过需要导出的总条数计算每个分页开始的索引值。

3、使用多线程的方式来并行导出

总结:

        方案二使用了分页和流式读取的两种方法来解决问题,希望可以解决一些同志们的工作问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计学R语言 实验3 点估计

统计学R语言 实验3 点估计 一、实验目的 1. 掌握理解点估计的相关概念和方法。 2. 掌握理解点估计的估计质量好坏判断方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 某灯泡厂从某日生产的一批灯泡中抽取10个灯泡进行寿命试验&#xff0c;得到灯泡寿命&…

鸿蒙开发笔记(七):应用状态管理,LocalStorage及AppStorage的使用

开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态管理的能力&#xff1a; LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的…

FPGA 高端项目:基于 SGMII 接口的 UDP 协议栈,提供2套工程源码和技术支持

目录 1、前言给读者的一封信免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、…

JRT核心竞争力

如果说JRT业务脚本化和发部署简单和打印导出客户端都不足以抵挡Spring用的人多的优势的话。那么这一篇让DolerGet给你一个选择JRT的理由&#xff0c;借助JRT自我实现的ORM&#xff0c;JRT有能力完全把控更新数据和删除数据的口径&#xff0c;和能够准确知道哪些是热点数据&…

细说JavaScript内置对象(JavaScript内置对象详解)

一、String对象 1、简单上手 2、构造方法 3、其他方法 3.1、charAt() 3.2、indexOf() 3.3、split() 3.4、substring() 3.5、substr() 4、实际操作 二、Math对象 1、简单上手 2、对象属性 3、对象方法 4、实际操作 三、Date对象 1、简单上手 2、构造方法 3、实…

Java零基础教学文档servlet(2)

【Servlet】 1.工程结构 2.J2EE平台 Java EE&#xff0c;Java平台企业版&#xff08;Java Platform Enterprise Edition&#xff09;&#xff0c;之前称为Java 2 Platform, Enterprise Edition (J2EE)&#xff0c;2018年3月更名为Jakarta EE。是Sun公司为企业级应用推出的标准…

Java实现高校大学生创业管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎&#xff1a;从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

时刻不忘为何而出发

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Linux内核架构和工作原理详解(一)

简介 作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内核启动init程序…

Bug:Goland左侧丢失项目结构(Goland常用快捷键)

Goland快捷键&小tips 1 常用快捷键 # 格式化代码 optioncommandL# 在项目中搜索文件中的内容 commandshiftF# 搜索.go文件 shiftshift&#xff08;按两次shift&#xff09;# 修改方法、变量&#xff08;同时替换引用处的名称&#xff09; fnshiftF6# 将选中代码抽取为方法…

QQ视频聊天怎么录制

虽然微信几乎成为主流的聊天工具&#xff0c;但是不可否认的是QQ视频聊天仍有他的趣味所在&#xff0c;多种特效在视频的时候增加乐趣&#xff0c;那么如果QQ视频聊天的时候可以录制聊天内容吗&#xff1f;当然是可以的。可以使用电脑自带的视频录制工具&#xff0c;或者QQ自带…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

EOCR电动机保护器故障原因查询

在电动机保护方面&#xff0c;电子式电机保护器的应用越来越广泛。电子式电动机保护器可靠性强、灵敏度高&#xff0c;并具有多种保护功能&#xff0c;如&#xff1a;过电流、欠电流、缺相、逆相、堵转、三相不平衡、接地、短路等。 但有一部分电子式电动机保护器产品在检测到…

自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结&#xff1a; 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化&#xff0c;因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…

Redcap UE camping相关规定

在接入网络时&#xff0c;可以通过系统信息的配置分别允许具有 1 个 Rx branch和 2 个 Rx branches的 RedCap UE接入。 此外&#xff0c;半双工 FDD RedCap UE也可以通过系统信息控制其接入。网络端会在在 SIB1 中提供 RedCap 特定的 Intra Frequency Reselection Indication&a…

CVE-2023-50290 Apache Solr 敏感信息泄露

项目介绍 Apache Solr 是流行的、速度极快的开源搜索平台&#xff0c;可满足您的所有企业、电子商务和分析需求&#xff0c;基于Apache Lucene构建。 项目地址 https://solr.apache.org 漏洞概述 Apache Solr 中未经授权的参与者漏洞暴露敏感信息。 Solr Metrics API 发布…

音频文件格式–celt

CELT介绍 CELT 是一种开放、免版税的有损音频压缩格式&#xff0c;也是一种免费软件编解码器&#xff0c;具有特别低的算法延迟&#xff0c;适用于低延迟音频通信。这些算法是公开记录的&#xff0c;并且可以不受软件专利限制地使用。 CELT 是一种基于改进的离散余弦变换 (MD…

vue中使用高德地图渲染多个不同类型的点,根据勾选数据 类型不同打点显示隐藏

一、在index.html文件中引入高德地图JavaScript API的2.0版本SDK <script src"https://webapi.amap.com/maps?v2.0&key你的高德地图Key"></script>二、创建一个Vue组件&#xff0c;用于渲染地图和点位 html <template><div class"m…

科研绘图(八)线性热图

线性热图&#xff08;Linear Heat Map&#xff09;是一种数据可视化技术&#xff0c;用于展示数值在一维线性空间上的分布情况。它通常用于展示沿着一条线&#xff08;例如时间线或任何一维序列&#xff09;的数据密度或强度变化。线性热图与传统的二维热图不同&#xff0c;后者…