当前位置: 首页 > news >正文

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 {// Test25MysqlFetchSizepublic 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

相关文章:

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

前言 这是一个 之前使用 spark 的时候 记一次 spark 读取大数据表 OOM OutOfMemoryError: GC overhead limit exceeded 因为一个 OOM 的问题, 当时使用了 fetchSize 的参数 应用服务 hang 住, 导致服务 503 Service Unavailable 在这个问题的地方, 出现了一个查询 32w 的数据…...

DevEco Studio 配置

首先,打开deveco studio 进入首页 …我知道你们想说什么,我也想说 汉化配置 没办法,老样子,先汉化吧,毕竟母语看起来舒服 首先,点击软件左下角的configure,在配置菜单里选择plugins 进入到插件页面, 输入chinese,找到汉化插件,(有一说一写到这我心里真是很不舒服) 然后点击o…...

Nginx自动探活后端服务状态自动转发,nginx_upstream_check_module的使用

一、三种方案 nginx对后端节点健康检查的方式主要有3种 1. gx_http_proxy_module 模块和ngx_http_upstream_module模块(自带) 官网地址:http://nginx.org/cn/docs/http/ng … proxy_next_upstream 严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通…...

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…...

lintcode 667 · 最长的回文序列【中等 递归到动态规划】

题目 https://www.lintcode.com/problem/667/ 给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.样例 样例1输入&#xff1a; "bbbab" 输出&#xff1a; 4 解释&#xff1a; 一个可能的最长回文序列为 "bbbb" 样例2输入…...

oracle sql语言模糊查询

在Where子句中&#xff0c;可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录&#xff0c;以下是可使用的通配符&#xff1a; % 零或者多个字符 _ 单一任何字符&#xff08;下划线&#xff09; / 特殊字符 [] 在某一范…...

【Ubuntu】解决ubuntu虚拟机和物理机之间复制粘贴问题(无需桌面工具)

解决Ubuntu虚拟机和物理机之间复制粘贴问题 第一步 先删除原来的vmware tools&#xff08;如果有的话&#xff09; sudo apt-get autoremove open-vm-tools第二步 安装软件包&#xff0c;一般都是用的desktop版本&#xff08;如果是server换一下&#xff09; sudo apt-get …...

解决ubuntu文件系统变成只读的方法

所欲文件变成只读&#xff0c;这种情况一般是程序执行发生错误&#xff0c;磁盘的一种保护措施 使用fsck修复 方法一&#xff1a; # 切换root sudo su # 修复磁盘错误 fsck -t ext4 -v /dev/sdb6 方法二&#xff1a; fsck.ext4 -y /dev/sdb6 重新用读写挂载 上面两种方法&…...

高数刷题笔记

常见等价无穷小 注意讨论 第二个等价无穷小 夹逼定理&#xff01;&#xff01;&#xff01; 递归数列可以尝试用关系式法 通常用到夹逼定理的时候都会用到放缩构造出一大一小两个函数&#xff0c;将原函数夹在中间&#xff0c;然后使得两端函数极限相同则可推出原函数的极限&am…...

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…...

2023年项目进度管理平台排行榜

项目进度管理是项目管理学科中的一门重要课程&#xff0c;通过合理的项目计划&#xff0c;有效控制项目进度&#xff0c;保障项目能够按时交付。 不过&#xff0c;项目进度管理并不是一件简单的工作&#xff0c;不仅需要面对项目过程中各种突发情况&#xff0c;还需要做好团队协…...

【设计模式】面向对象设计八大原则

&#xff08;1&#xff09;依赖倒置原则&#xff08;DIP&#xff09; 高层模块&#xff08;稳定&#xff09;不应该依赖于低层模块&#xff08;变化&#xff09;&#xff0c;二者都应该依赖于抽象&#xff08;稳定&#xff09;。抽象&#xff08;稳定&#xff09;不应该依赖于…...

python数分实战探索霍尔特法之销售预测python代码实现以及预测图绘制

探索霍尔特法:时间序列预测中的线性趋势捕捉 时间序列分析是统计学和数据分析中的一个核心领域。无论是预测股票市场的走势,还是预测未来的销售量,一个精确和可靠的预测模型都是至关重要的。在众多的时间序列预测方法中,霍尔特法(Holts method)脱颖而出,特别是当我们面…...

java线程状态

图形说明: Thread.State源码注释: public enum State {/*** 新生状态&#xff1a;线程对象创建&#xff0c;但是还未start()*/NEW,/*** 线程处于可运行状态&#xff0c;但是这个可运行状态并不代表线程一定在虚拟机中执行。* 需要等待从操作系统获取到资源(比如处理器时间片…...

编译问题:error: ‘printf’ was not declared in this scope

这个错误提示意味着编译器在当前作用域内无法找到 printf 函数的声明。这通常是因为没有包含 <stdio.h> 头文件导致的。 解决方法是在程序中添加 #include <stdio.h> 这一行代码。这个头文件中包含了 printf 函数的声明&#xff0c;告诉编译器如何处理该函数。...

改变C++中私有变量成员的值

1、没有引用的情况&#xff1a; #include <iostream> #include <queue> using namespace std; class Person { public:queue<int>que; public:queue<int> getQueue(){return que;}void push(int a){que.push(a);}void pop(){que.pop();} };int main()…...

线程唯一的单例

经典设计模式的单例模式是指进程唯一的对象实例&#xff0c;实现code如下&#xff1a; package cun.zheng.weng.design.sinstnce;import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExec…...

明厨亮灶监控实施方案 opencv

明厨亮灶监控实施方案通过pythonopencv网络模型图像识别算法&#xff0c;一旦发现现场人员没有正确佩戴厨师帽或厨师服&#xff0c;及时发现明火离岗、不戴口罩、厨房抽烟、老鼠出没以及陌生人进入后厨等问题生成告警信息并进行提示。OpenCV是一个基于Apache2.0许可&#xff08…...

14 mysql bit/json/enum/set 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 bit/json/enum/set 类类型的相关…...

04_19linux自己撸内存池实战,仿造slab分配器

前言 自己撸一个内存池 其实就相当于linux里面带的 slab分配器 可以翻翻之前的章 看看slab 和伙伴分配器的不同 在学习c语言时&#xff0c;我们常常会使用到malloc()去申请一块内存空间&#xff0c;用于存放我们的数据。刚开始我们只要知道申请内存时使用用malloc去申请一块就…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…...

GitHub 常见高频问题与解决方案(实用手册)

1.Push 提示权限错误&#xff08;Permission denied&#xff09; 问题&#xff1a; Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因&#xff1a; 没有配置 SSH key 或使用了 HTTPS 而没有权限…...

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)

目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题&#xff0c;描述如下&#xff1a; 我在qtdesigner用界面拖了一个QTableView控件&#xff0c;object name为【tableView_electrode】&#xff0c;然后【提升为】了自定义的类【Steer_Electrode_Table】&…...

docker 部署redis集群 配置

docker的网络模式 网桥模式每次重启容器都有可能导致容器ip地址变化&#xff0c;需要固定ip的自己自定义网络&#xff0c;这里介绍的是默认网络模式 docker创建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…...