博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql中使用流式查询避免数据量过大导致OOM
阅读量:7003 次
发布时间:2019-06-27

本文共 1111 字,大约阅读时间需要 3 分钟。

点击上方关注,每天学习一个java知识点

一、前言

MySQL 是目前使用比较广泛的关系型数据库,而从数据库里面根据条件查询数据到内存的情况想必大家在日常项目实践中都有使用。

当指定条件的数据量特别大时候一般是通过分页的方式在前端页面通过 Tag 标签一页页的加载数据到内存;但是有些情况下却不需要用户切换 Tag 标签的方式一页页的加载数据,这时候如果一下子全部把数据加载内存,就有可能会导致 OOM,虽然这时候可以通过程序控制分页查询,但是每次查询时候数据库都需要把所有符合条件的数据查询出来然后根据当前页的返回来返回指定的页,这无疑加重了 MySQL 服务器不必要的开销。

其实在 MySQL 中提供了流式查询,这允许把符合条件的数据一部分一部分的加载到内存,本 Chat 就来具体讲解如何在 MySQL中使用流式查询:

使用流式查询前,我们是如何在 MySQL 中进行查询数据的,整个过程发生了什么?

如何使用 JDBC 编程方式在 MySQL 中使用流式查询?

二、普通查询

Mysql中使用流式查询避免数据量过大导致OOM

- 当我们在JVM进程里面的某一个线程里面执行数据库查询时候,其实这个请求首先会调用mysql驱动程序。

- mysql驱动接受到请求后会向MySQL服务器发起TCP请求,服务器端根据条件查询出匹配的数据,然后通过TCP链接发送到MySQL驱动

- MySQL驱动内则会把符合条件的数据缓存到驱动内,等服务器返回了所有符合条件的数据后,在一下子把缓存里面的数据返回给调用sql的应用程序。

所以如果查询的数据量特别大,那么mysql驱动内缓存就可能把内存撑爆造成OOM。

三、JDBC编程中MySQL流式查询

mysql客户端流式查询不会一下子把服务器端所有数据缓存起来,而是一部分一部分的把服务器端返回的数据返回给应用程序层,所以可以有效避免OOM。

之前查询

Mysql中使用流式查询避免数据量过大导致OOM

Mysql中使用流式查询避免数据量过大导致OOM

现在流式查询

Mysql中使用流式查询避免数据量过大导致OOM

Mysql中使用流式查询避免数据量过大导致OOM

可知只是prepareStatement时候改变了参数,并且设置了PreparedStatement的fetchsize为Integer.MIN_VALUE。

结果对比

对于同一个sqlCmd,同一批数据,使用两种方式占用内存对比如下:

  • 非流式编程
Mysql中使用流式查询避免数据量过大导致OOM

  • 流式编程
Mysql中使用流式查询避免数据量过大导致OOM

另外非流式方式由于是把符合条件的数据一下子全部加在到内存,并且由于数据量比较大,需要mysql处理的时间比较长,我测试情况下需要一分钟才会返回结果到内存(数据量比较大),然后才能通过数据集返回数据。

而流式方式是每次返回一个记录到内存,所以占用内存开销比较小,并且调用后会马上可以访问数据集的数据。

作者:阿里加多

链接:https://www.jianshu.com/p/c1e6eeb71c74

转载地址:http://yvrvl.baihongyu.com/

你可能感兴趣的文章
深入分析事务的隔离级别
查看>>
基于Vue2 搭建移动端 webapp 框架
查看>>
Android View体系(四)从源码解析Scroller
查看>>
Cannot lock storage /tmp/hadoop-root/dfs/name. The directory is already locked.
查看>>
BFS和DFS的java实现
查看>>
Struts2框架起源
查看>>
Chromosome coordinate systems: 0-based, 1-based
查看>>
Myeclipse10集成Flex4.6
查看>>
java电影站点开发经验3
查看>>
notepad++自动对齐使用空格代替Tab并将空格显示为小点
查看>>
开源APM系统skywalking介绍与使用
查看>>
rabbitmqctl 报错
查看>>
elasticsearch 安装ik中文分词
查看>>
解决OS睡眠功能中,移动鼠标就会唤醒
查看>>
深入理解VMware虚拟机网络通信原理
查看>>
SpringMVC中使用Interceptor拦截器
查看>>
摩斯密码加解密
查看>>
徒弟涨工资排行榜
查看>>
关于庖丁分词
查看>>
JavaScript 数组去重并统计重复元素出现的次数
查看>>