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

news2024/11/16 5:59:41

阿丹-需求/场景:

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

        因为要写入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、使用多线程的方式来并行导出

总结:

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

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

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

相关文章

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法&#xff0c;可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

【Vue】后端返回文件流,前端预览文件

let date;request({url: this.$route.query.url,method: get,responseType: blob,}).then(resp > {date respthis.path window.URL.createObjectURL(new Blob([resp], {type: "application/pdf"}))}).catch((e) > {//旧版本浏览器下的blob创建对象window.Blo…

2019年认证杯SPSSPRO杯数学建模C题(第二阶段)保险业的数字化变革全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计建模的车险业数字变革研究 C题 保险业的数字化变革 原题再现&#xff1a; 车险&#xff0c;即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度&#xff0c;车险即为分散机动车辆在行驶过程中可能发作的未知风险和损失…

基于无人机的消防灭火系统设计

摘要&#xff1a;人类社会的进步&#xff0c;使火灾变得更加频繁且越来越复杂&#xff0c;随着这些年无人机技术的发展&#xff0c;将无人机技术融入消防灭火逐渐变成必然。消防救援采用无人机主要有以下几点原因&#xff1a;一、对火场及火场周围环境信息十分匮乏&#xff0c;…

CUDA tips

命令行查看核函数消耗的寄存器和共享内存数量 nvcc --ptxas-options-v reduce_sum.cu nvprof 使用 由于 8.0 及以上计算能力的显卡用不了 nvprof&#xff0c;官方建议用 nsight system 和 ncu&#xff0c;但是如果只想命令行打印表格查看 kernel 概况感觉还是 nvprof 方便&am…

.Net Core 使用 AspNetCoreRateLimit 实现限流

上一篇文章介绍过ASP.NET Core 的 Web Api 实现限流 中间件-CSDN博客 使用.NET 7 自带的中间件 Microsoft.AspNetCore.RateLimiting 可以实现简单的Api限流&#xff0c;但是这个.NET 7以后才集成的中间件&#xff0c;如果你使用的是早期版本的.NET&#xff0c;可以使用第三方库…

「解析」Jetson配置 git服务

这两天感冒了在家休养&#xff0c;想着把之前买的 Jetson 开发板用起来&#xff0c;买Jetson的初衷就是用来学习Linux系统&#xff0c;顺道可以部署算法&#xff0c;以及一些其他需求&#xff0c;相比树莓派而言&#xff0c;Jetson开发相对更贵&#xff0c;但是其配备了英伟达的…

科研绘图(五)玫瑰图

柱状图的高级平替可视化 “玫瑰图”&#xff0c;通常也被称为“科克斯图”。它类似于饼图&#xff0c;但不同之处在于每个部分&#xff08;或“花瓣”&#xff09;的角度相同&#xff0c;半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用&#xff0c;比…

log4j2漏洞综合利用_CVE-2021-44228_CNVD-2021-95919

1.漏洞利用 1.1.rmi 利用 1、在检测到目标存在 log4j2 漏洞后&#xff0c;确定漏洞参数&#xff0c;尝试接受目标 rmi 请求。 成功接收到请求。 出现 JRMIK 字样即代表可接受 RMI 请求。 2、漏洞利用。 使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar执行命令&#xff0…

SAP 销售订单审批状态(查询/修改)

销售订单审批状态启用后&#xff0c;前端显示界面如下图 销售订单审批状态读取&#xff1a;STATUS_READ 销售订单审批状态修改&#xff1a;I_CHANGE_STATUS 销售订单审批状态读取 代码样例如下&#xff1a; DATA: lv_objnr TYPE vbak-objnr,lv_objnr_t TYPE jsto-objnr,l…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …

soso移动营业大厅(纯后端+MySQL数据库+JDBC)

一、项目需求 中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各…

ElasticSearch入门篇

目录 一、 ElasticSearch的定位 二、 什么是倒排索引 三、 什么是全文检索 四、 ElasticSearch的数据存储原理 4.1 ElasticSearch与关系型数据库的数据结构对比 4.2 ElasticSearch的倒排索引原理 一、 ElasticSearch的定位 ElasticSearch是一款开源的分布式 搜索和…

【Linux终端工具】Tmux的使用教程,如何正确使用Tmux

文章目录 入门tmux什么是tmux&#xff1f;安装tmux快速启动tmux基本操作入门1. 分离与退出2. 帮助信息3. 新建会话4. 重新接入会话5. 窗格操作 进阶操作1. 会话管理2. 切换窗口3. 窗格间切换 总结 入门tmux 什么是tmux&#xff1f; tmux是一款终端复用器&#xff0c;它允许你…

一、ArcGIS Pro SDK for Microsoft .NET 开发环境配置

ArcGIS Pro二次开发需要的工具&#xff1a; 1.Visual Studio 2.ArcGIS Pro SDK 一、Visual Studio安装 经过查阅资料&#xff0c;ArcGIS Pro3.0版本需要安装Visual Studio2022版&#xff0c;因为只有22版的才会有有ArcGIS Pro3.0以上版对应ArcGIS Pro SDK&#xff0c;因此&…

MySQL核心SQL

一.结构化查询语言 SQL是结构化查询语言&#xff08;Structure Query Language&#xff09;&#xff0c;它是关系型数据库的通用语言。 SQL 主要可以划分为以下 3 个类别&#xff1a; DDL&#xff08;Data Definition Languages&#xff09;语句 数据定义语言&#xff0c;这…

通过Canal实现缓存同步

文章目录 1.数据同步策略2.初始Canal3.安装Canal4.监听Canal 1.数据同步策略 2.初始Canal 3.安装Canal 见文章安装Canal详情 4.监听Canal