09 mysql fetchSize 所影响的服务器和客户端的交互

前言

这是一个 之前使用 spark 的时候 记一次 spark 读取大数据表 OOM OutOfMemoryError: GC overhead limit exceeded 因为一个 OOM 的问题, 当时使用了 fetchSize 的参数 

应用服务 hang 住, 导致服务 503 Service Unavailable 在这个问题的地方, 出现了一个查询 32w 的数据, 呵呵 这里又看了一下 fetchSize 的相关, 需要梳理一下 fetchSize 这块的东西

但是 当时不知道 这个 fetchSize 所影响的 客户端 和 服务器 之间交互的具体的处理 

这里 来看一下 

测试用例 

需要体现是否使用 fetchSize 的差异, 只需要 切换 getDataSource 的 url, 有 "useCursorFetch=true" 为使用 fetchSize 

/**
 * Test25MysqlFetchSize
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2022-10-15 14:03
 */
public class Test25MysqlFetchSize {

    // Test25MysqlFetchSize
    public static void main(String[] args) {

        String[] authInfo = {"127.0.0.1", "3306", "test", "postgres", "postgres"};
        DataSource ds = getDataSource(authInfo[0], Integer.parseInt(authInfo[1]), authInfo[2], authInfo[3], authInfo[4]);
        JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
        jdbcTemplate.setFetchSize(2);

        String sql = "select * from `user`;";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        for(Map<String, Object> entity : list) {
            System.out.println(JSON.toJSONString(entity));
        }

    }

  /**
   * 根据给定的连接信息 获取数据源
   *
   * @param ip       ip
   * @param port     port
   * @param dbName   dbName
   * @param username username
   * @param password password
   * @return java.sql.Connection
   * @author Jerry.X.He
   * @date 2019-08-15 11:50
   */
  public static DataSource getDataSource(String ip, int port, String dbName, String username, String password) {
//    String url = String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=UTF8&useCursorFetch=true&defaultFetchSize=100", ip, port, dbName);
    String url = String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=UTF8", ip, port, dbName);
    try {
      return new SimpleDriverDataSource(new Driver(), url, username, password);
    } catch (Exception e) {
      return null;
    }
  }


}

不使用 fetchSize 的场景

客户端发送一个请求, 然后服务器 将所有的数据响应给客户端 

1be571100cf64736b650ee0e6a571437.png

使用 fetchSize 的场景 

可以看到的是 发送了一个 sql, 以及十多条 fetch 的命令到 mysql 服务器 

第一条 fetch 命令, 前 0-100 条数据 

第二条 fetch 命令, 前 100-200 条数据 

 ... 

第N条 fetch 命令, 前 (N-1)*100 - N * 100 条数据 

5bc2b52eed2544349e86dcad5f733962.png

fetchSize 为 100, 总共数据量为 1216, 然后 客户端合计发送了 13 条 fetch 的请求 

4792	4.403080	127.0.0.1	127.0.0.1	MySQL	82	Request Prepare Statement
4795	4.404626	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1207 Ack=1482 Win=406784 Len=0 TSval=966581250 TSecr=966581250
4802	4.407809	127.0.0.1	127.0.0.1	MySQL	71	Request Execute Statement
4805	4.411114	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1222 Ack=1684 Win=406592 Len=0 TSval=966581255 TSecr=966581255
4852	4.424561	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4855	4.426304	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1235 Ack=4795 Win=403456 Len=0 TSval=966581267 TSecr=966581267
4872	4.436417	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4875	4.438114	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1248 Ack=7906 Win=400384 Len=0 TSval=966581277 TSecr=966581277
4876	4.441996	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4879	4.443469	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1261 Ack=11017 Win=397248 Len=0 TSval=966581281 TSecr=966581281
4880	4.446411	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4883	4.447904	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1274 Ack=14128 Win=394112 Len=0 TSval=966581284 TSecr=966581284
4884	4.450804	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4887	4.452125	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1287 Ack=17239 Win=391040 Len=0 TSval=966581287 TSecr=966581287
4888	4.454689	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4891	4.456075	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1300 Ack=20350 Win=387904 Len=0 TSval=966581290 TSecr=966581290
4892	4.458345	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4895	4.459971	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1313 Ack=23461 Win=384832 Len=0 TSval=966581293 TSecr=966581293
4896	4.462152	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4899	4.463530	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1326 Ack=26572 Win=381696 Len=0 TSval=966581296 TSecr=966581296
4900	4.465897	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4903	4.468078	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1339 Ack=29683 Win=378560 Len=0 TSval=966581300 TSecr=966581300
4904	4.469424	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4907	4.471176	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1352 Ack=32794 Win=375488 Len=0 TSval=966581302 TSecr=966581302
4908	4.473213	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4911	4.474650	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1365 Ack=35905 Win=372352 Len=0 TSval=966581304 TSecr=966581304
4912	4.476087	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4915	4.477380	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1378 Ack=39016 Win=369280 Len=0 TSval=966581306 TSecr=966581306
4916	4.478625	127.0.0.1	127.0.0.1	MySQL	69	Request Fetch Data
4919	4.480168	127.0.0.1	127.0.0.1	TCP	56	54350 → 3306 [ACK] Seq=1391 Ack=39523 Win=368768 Len=0 TSval=966581308 TSecr=966581308
4920	4.480690	127.0.0.1	127.0.0.1	MySQL	65	Request Close Statement

driver 层面 fetchSize 的处理

堆栈信息大致如下 

应用通过 resultSet.next 向后迭代 

resultSet 中 ResultsetRowsCursor 不断向后迭代当前批次的数据, 如果当前批次的数据已经迭代完毕, 重新向 mysql 服务器发送 fetch 命令, 获取下一批次的数据 

如果应用不强行引用, 内内存中常驻的记录数量为 fetchSize 条记录, 进而 缩小需要占用的内存开销 

f5159f65bd114804b56a2710cfe3bec7.png

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

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

相关文章

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

系列文章目录 分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 前言 一 hadoop的相关概念 1.1 Hadoop概念 补充&#xff1a;块的存储 1.2 HDFS是什么 1.3 三种节点的功能 I、NameNode节点 II、fsimage与edits…

【代码技巧】深度学习参数管理方案(1)

方法概述 利用argparse工具包进行参数管理 创建BaseOptions类进行基础参数的管理&#xff0c;在建立TrainOptions和TestOpetions继承BaseOptions的基础参数&#xff0c;然后可以再添train或者test阶段的新的参数。 文件结构 创建三个文件如图&#xff0c;分别管理BaseOption…

RocketMQ消息队列-@RocketMQMessageListener实现原理

使用Spring-RocketMQ时&#xff0c;只需要引入rocketmq-spring-boot-starter包&#xff0c;并且定义以下消费者&#xff0c;就可以很简单的实现消息消费 Component RocketMQMessageListener(topic "first-topic", consumerGroup "my-producer-group", s…

6. series对象及DataFrame对象知识总结

【目录】 文章目录 6. series对象及DataFrame对象知识总结1. 导入pandas库2. pd.Series创建Series对象2.1 data 列表2.2 data 字典 3. s1.index获取索引4. s1.value获取值5. pd.DataFrame()-创建DataFrame 对象5.1 data 列表5.2 data 嵌套列表5.3 data 字典 6. df[列索引]…

机器学习——KNN算法

1、&#xff1a;前提知识 KNN算法是机器学习算法中用于分类或者回归的算法&#xff0c;KNN全称为K nearest neighbour&#xff08;又称为K-近邻算法&#xff09; 原理&#xff1a;K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 优点&#xff1a;精度高 缺点&…

基于Stable Diffusion的AIGC服饰穿搭实践

本文主要介绍了基于Stable Diffusion技术的虚拟穿搭试衣的研究探索工作。文章展示了使用LoRA、ControlNet、Inpainting、SAM等工具的方法和处理流程&#xff0c;并陈述了部分目前的实践结果。通过阅读这篇文章&#xff0c;读者可以了解到如何运用Stable Diffusion进行实际操作&…

《Web安全基础》04. 文件上传漏洞

web 1&#xff1a;文件上传漏洞2&#xff1a;WAF 绕过2.1&#xff1a;数据溢出2.2&#xff1a;符号变异2.3&#xff1a;数据截断2.4&#xff1a;重复数据 本系列侧重方法论&#xff0c;各工具只是实现目标的载体。 命令与工具只做简单介绍&#xff0c;其使用另见《安全工具录》…

【MySQL学习笔记】(七)内置函数

内置函数 日期函数示例案例-1案例-2 字符串函数示例 数学函数其他函数 日期函数 示例 获得当前年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-09-03 | ---------------- 1 row in set (0.00 sec)获得当前时分秒…

Web安全——穷举爆破上篇(仅供学习)

Web安全 一、概述二、常见的服务1、burpsuite 穷举后台密码2、burpsuite 对 webshell 穷举破解密码3、有 token 防御的网站后台穷举破解密码3.1 burpsuite 设置宏获取 token 对网站后台密码破解3.2 编写脚本获取token 对网站后台密码破解 4、针对有验证码后台的穷举方法4.1 coo…

Autofac中多个类继承同一个接口,如何注入?与抽象工厂模式相结合

多个类继承同一个接口,如何注入&#xff1f;与抽象工厂模式相结合 需求: 原来是抽象工厂模式,多个类继承同一个接口。 现在需要使用Autofac进行选择性注入。 Autofac默认常识: Autofac中多个类继承同一个接口,默认是最后一个接口注入的类。 解决方案&#xff1a;(约定大于配…

ssm+vue“魅力”繁峙宣传网站源码和论文

ssmvue“魅力”繁峙宣传网站源码和论文102 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身…

16 个前端安全知识

16 个前端安全知识 去年 security course 上的是 React&#xff0c;然后学了一些 一些 React 项目中可能存在的安全隐患&#xff0c;今年看了一下列表&#xff0c;正好看到了前端也有更新&#xff0c;所以就把这个补上了。 一个非常好学习各种安全隐患的机构是 https://owasp…

国标视频云服务EasyGBS国标视频平台迁移服务器后无法启动的问题解决方法

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

Java“牵手”1688图片识别商品接口数据,图片地址识别商品接口,图片识别相似商品接口,1688API申请指南

1688商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要通过图片地址识别获取1688商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常…

隧道结构健康监测系统,保障隧道稳定安全运行

隧道是地下隐蔽工程&#xff0c;会受到潜在、无法预知的地质因素影响&#xff0c;早期修建的隧道经常出现隧道拱顶开裂、地表沉降、隧道渗漏水、围岩变形、附近建筑物倾斜等隧道的健康问题变得日益突出&#xff0c;作为城市生命线不可或缺的一部分&#xff0c;为了确保隧道工程…

【C++技能树】继承概念与解析

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…

无涯教程-JavaScript - WEIBULL函数

WEIBULL函数取代了Excel 2010中的WEIBULL.DIST函数。 描述 该函数返回威布尔分布。在可靠性分析中使用此分布,如计算设备的平均故障时间。 语法 WEIBULL(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.Requir…

度矩阵、邻接矩阵

度矩阵&#xff08;degree matrix&#xff09; 度矩阵是对角阵&#xff0c;对角上的元素为各个顶点的度&#xff0c;顶点vi的度表示和该顶点相关联的变得数量。 在无向图中&#xff0c;顶点vi的度d(vi)N(i)&#xff08;即与顶点相连的边的数目&#xff09;有向图中&#xff0…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

Linux 指令心法(四)`touch` 创建一个新的空文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 touch 是一个用于在 Linux 和 Unix 系统中创建空文件或更改现有文件的访问和修改时间的命令。如果指定的文件不存在&#xff0c;touch会创建一个新的空文件&a…