一、序言
MySQL 是目前利用比较广泛的关系型数据库,而从数据库里面根据条件查询数据到内存的情形想必大家在日常项目实践中都有利用。
当指定条件的数据量特殊大时候一样平常是通过分页的办法在前端页面通过 Tag 标签一页页的加载数据到内存;但是有些情形下却不须要用户切换 Tag 标签的办法一页页的加载数据,这时候如果一下子全部把数据加载内存,就有可能会导致 OOM,虽然这时候可以通过程序掌握分页查询,但是每次查询时候数据库都须要把所有符合条件的数据查询出来然后根据当前页的返回来返回指定的页,这无疑加重了 MySQL 做事器不必要的开销。

其实在 MySQL 中供应了流式查询,这许可把符合条件的数据一部分一部分的加载到内存,本 Chat 就来详细讲解如何在 MySQL中利用流式查询:
利用流式查询前,我们是如何在 MySQL 中进行查询数据的,全体过程发生了什么?
如何利用 JDBC 编程办法在 MySQL 中利用流式查询?
二、普通查询
- 当我们在JVM进程里面的某一个线程里面实行数据库查询时候,实在这个要求首先会调用mysql驱动程序。
- mysql驱动接管到要求后会向MySQL做事器发起TCP要求,做事器端根据条件查询出匹配的数据,然后通过TCP链接发送到MySQL驱动
- MySQL驱动内则会把符合条件的数据缓存到驱动内,等做事器返回了所有符合条件的数据后,在一下子把缓存里面的数据返回给调用sql的运用程序。
以是如果查询的数据量特殊大,那么mysql驱动内缓存就可能把内存撑爆造成OOM。
三、JDBC编程中MySQL流式查询
mysql客户端流式查询不会一下子把做事器端所有数据缓存起来,而是一部分一部分的把做事器端返回的数据返回给运用程序层,以是可以有效避免OOM。
之前查询
现在流式查询
可知只是prepareStatement时候改变了参数,并且设置了PreparedStatement的fetchsize为Integer.MIN_VALUE。
结果比拟对付同一个sqlCmd,同一批数据,利用两种办法占用内存比拟如下:
非流式编程流式编程其余非流式办法由于是把符合条件的数据一下子全部加在到内存,并且由于数据量比较大,须要mysql处理的韶光比较长,我测试情形下须要一分钟才会返回结果到内存(数据量比较大),然后才能通过数据集返回数据。
而流式办法是每次返回一个记录到内存,以是占用内存开销比较小,并且调用后会立时可以访问数据集的数据。
作者:阿里加多
链接:https://www.jianshu.com/p/c1e6eeb71c74