Mysql大数据量下流式查询优化:Jdbc中的useFetchSize参数及其原理解析

news2024/9/22 4:07:23

前言

最近我朋友公司有个需求场景:查询千万级数据量并写入txt文件的程序优化需求。

朋友找到我对程序进行优化, 不然饭碗不保......💦

下面就分享一下解决这个优化问题的过程和思路,并总结一下,在以后不要在踩同样的坑。

现象描述

在查询千万级数据量并生成txt文件,出现以下2个问题

  1. 1. 由于数据量巨大,直接导致JVM的堆内存满, 程序出现假死状态,频繁的full GC, 同时服务器CPU 100%

  2. 2. 程序出现假死,在服务器上执行 jstack [pid] 查看JVM堆栈信息,提示无法建立。

遇到此问题,首先想到的是可以加大JVM的堆内存,可以避免程序假死。这也只是临时解决办法,还得从代码和数据库上下手。

🎉开启优化之路V1.0

经过程序分析:

程序并没有使用Stream流式查询,而且也没有采用分批查询,分批写入txt的文件。

于是乎,改写代码为流式查询,优化如下:(以下代码是经过脱敏处理)

改写DataMapper文件:

@SelectProvider(type = DataMapperProvider.class, method = "getDatasStreamByCode")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 10000)  // 配置流失查询
    @ResultType(LinkedHashMap.class)
    void getDatasStreamByCode(String code, ResultHandler<LinkedHashMap> handler);

改写service文件:

// 按行写入txt
StringBuffer sb = new StringBuffer();
dataMapper.getDatasStreamByCode(code, resultContext -> {
// 获取到10000条
LinkedHashMap<String, String> dataList = (LinkedHashMap<String, String>) resultContext.getResultObject();
// 业务处理
.....

// 分批写入文件
});

按照上面改写之后的程序,发给我朋友去上线之后,确实能提升一定的效果。

过了一段时间之后,我朋友找到我之后,还是出现了同样的问题。

听到这个消息,我始终觉得不应该啊,这难道又被百度忽悠了。这骨头有这么难啃吗?🎨

🎃开启优化之路V2.0

经过分析,发现问题所在:

  1. 1. Mysql执行还是把查询结果全部传输到应用端进行缓存,再按批给到程序处理。此操作还是会造成JVM堆不够用。

  2. 2. Mysql非常特殊, 默认是关闭了流式查询,需要在JdbcUrl上增加useCursorFetch=true参数。

  3. 3. Mysql如果在JdbcUrl增加useCursorFetch=true, 但是程序执行的时候,报Mysql的临时表空间满 异常。

现在有个问题摆在面前 不加useCursorFetch参数,JVM堆内存会满。加了useCursorFetch参数,Mysql临时表空间会满。

这个和大部分网上答案描述不符合呢。那该如何破局呢?

站在表象是解决不了问题的,不得不深入源码分析,看看底层设计,发现是否有什么关键点被遗漏忽视掉。

追根溯源

源码分析大致思路,根据useCursorFetch这个关键字入手,从github上下载Mysql驱动包的源码分析。

  1. 1. 从Mysql驱动源码入手 最主要的类StatementImpl 执行查询逻辑都在此方法。

关键路径1:com.mysql.cj.jdbc.StatementImpl#useServerFetch

60138e0601853cf14d5b782d7f02c609.jpeg

关键路径2:com.mysql.cj.jdbc.StatementImpl#createStreamingResultSet

0cb5c776941e64d1971139d8ab86ca8c.jpeg

从上面两个地方可以大致总结如下:

查询分类:

  1. 1. 普通查询 (默认不开启)

  2. 2. 分段式查询 (useCursorFetch=true && resultType == FORWARD_ONLY && fetchSize > 0)

  3. 3. 流式查询 (useCursorFetch=true && resultType == FORWARD_ONLY && fetchSize = Integer.MIN_VALUE)

解决之道

从上面分析可以总结出,采用流式查询更加适合当前业务, 而分段式查询这种也是我们新手经常犯的小失误哈。

需要把fetchSize=10000修改成fetchSize=Integer.MIN_VALUE, 这个才是真正意义上的流式查询方式。

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

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

相关文章

滴水逆向1

八进制加法乘法表 EF11101111 j记住其映射关系 十进制的定义&#xff1a;由十个符号组成&#xff0c;分别是0 1 2 3 4 5 6 7 8 9 逢十进一。九进制的定义&#xff1a;由九个符号组成&#xff0c;分别是0 1 2 3 4 5 6 7 8 逢九进一。十六进制的定义&#xff1a;由十六个符号组成…

C++ 对象模型 | 关于对象

一、C 对象模型 1、对象内存布局 在C中&#xff0c;有两种数据成员&#xff1a;static和nonstatic&#xff0c;以及三种成员方法static、nonstatic、virtual&#xff0c;下面从虚函数、非虚函数、静态成员变量、非静态成员变量等维度来分析&#xff0c;类对象的内存布局。例如…

苍穹外卖Day01——总结1

总结1 1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 技术选项 3. Swagger4. 补充内容&#xff08;待解决...&#xff09; 1. 软件开发整体介绍 1.1 软件开发流程 1.2 角色分工 从角色分工里面就可以查看自己以后从事哪一…

lv14 IO模型:阻塞和非阻塞 7

1 五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误(通过轮询即才能实现阻塞的情况 &#xff09; 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&a…

视频AI智剪方法:快速批量处理视频,批量剪辑视频的操作

随着科技的飞速发展&#xff0c;视频内容已是获取信息和娱乐的主要方式之一。对于视频创作者和内容生产者来说&#xff0c;如何快速、高效地处理和剪辑大量视频已成为一项重要的需求。现在借助AI技术的不断发展&#xff0c;可以更加智能、高效的处理视频。下面来看云炫AI智剪如…

kubernetes入门到进阶(5)

目录 镜像仓库&#xff1a;怎么用好docker hub这个宝藏 什么是镜像仓库&#xff08;Registry&#xff09; 什么是docker hub 如何在docker hub上挑选镜像 docker hub上进行概念股命名规则是什么 该怎么上传自己的镜像 离线环境该怎么办 小结 镜像仓库&#xff1a;怎么用好docke…

《BackTrader量化交易图解》第8章:plot 绘制金融图

文章目录 8. plot 绘制金融图8.1 金融分析曲线8.2 多曲线金融指标8.3 Observers 观测子模块8.4 plot 绘图函数的常用参数8.5 买卖点符号和色彩风格8.6 vol 成交参数8.7 多图拼接模式8.8 绘制 HA 平均 K 线图 8. plot 绘制金融图 8.1 金融分析曲线 BackTrader内置的plot绘图函…

多线程-synchronized详解

1、基本作用&#xff1a;Java提供了一种内置的锁机制来支持原子性&#xff0c;同步代码块&#xff08;Synchronized Block &#xff09; 同步代码块包括两个部分&#xff1a; 1、锁的对象引用。2、锁作用的代码块。 例子&#xff1a; synchronized(Object){ //被保护的共享…

windows安装kafka以及kafka管理工具推荐

windows安装 1.下载地址 下载地址 下载最新版本的.tgz文件解压 2.修改配置 修改config目录下的zookeeper.properties中的dataDir属性 server.properties文件中的log.dir属性 3.启动zookeeper 进入到bin\windows\下的用cmd输入zookeeper-server-start.bat ..\..\config\zo…

【陈老板赠书活动 - 21期】- Python树莓派编程从零开始(第3版)

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f934;本文简述&#xff1a;活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f473;‍♂️上一篇文章&#xff…

LaTex引用字体变色

使用下面这条语句进行修改。 ‘citecolor’改变参考文献颜色&#xff0c; ‘linkcolor’改变图标公式引用的颜色&#xff0c; ‘urlcolor’ 文本网站超链接颜色。 \usepackage[colorlinks,bookmarksopen,bookmarksnumbered,citecolorblue, linkcolorblue, urlcolorblue]{hyper…

Python 常用数据类型

Python 常用数据类型有以下这些&#xff1a; 数据类型中文解析例子int整数&#xff0c;表示整数值1、2float浮点数&#xff0c;表示带有小数点的数值3.14、2.718complex复数&#xff0c;表示实部和虚部组成的复数12j、3-4jstr字符串&#xff0c;表示文本数据&#xff0c;用引号…

最优化理论分析复习--最优性条件(一)

文章目录 上一篇无约束问题的极值条件约束极值问题的最优性条件基本概念只有不等式约束时 下一篇 上一篇 最优化理论复习–对偶单纯形方法及灵敏度分析 无约束问题的极值条件 由于是拓展到向量空间 R n R^n Rn, 所以可由高数中的极值条件进行类比 一阶必要条件 设函数 f (…

SpringCloud系列篇:核心组件之配置中心组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.前言 二.配置中心组件是什么 三…

【年度重磅】《2023华为开发者宝典》覆盖16+技术领域,30+华为云专家倾力打造,免费下载

《2023华为开发者宝典》重磅发布&#xff0c;点击下载&#xff0c;欢迎大家转发赠阅&#xff0c;相互交流学习。 时光荏苒&#xff0c;转眼间我们已经告别挑战与机遇并存的2023年&#xff0c;迎接充满无限可能的2024年。 截至到2023年&#xff0c;华为云生态已聚合了全球超过5…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

用js随机添加字母

样式 <style>.itp {width: 200px;height: 60px;border: 5px solid red;text-align: center;line-height: 60px;font-size: 30px;margin: 10px;}button {width: 80px;height: 30px;color: rgb(229, 225, 232);border-radius: 4px;font-size: 20px;outline: none;border: …

猫头虎分享已解决Bug || 解决Vue.js not detected的问题 ️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

WEB 3D技术 three.js 顶点旋转

我们来说说几何体顶点的旋转 官网搜索 BufferGeometry 这里 我们有 x y z 三个轴的旋转 例如 我们这样的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; i…

阿里云新用户的定义与权益

随着云计算的普及&#xff0c;阿里云作为国内领先的云计算服务提供商&#xff0c;吸引了越来越多的用户。对于新用户来说&#xff0c;了解阿里云新用户的定义和相关权益非常重要&#xff0c;因为它关系到用户能否享受到更多的优惠和服务。 一、阿里云新用户的定义 阿里云新用户…