问题场景
Mysql数据处理类型分以下三种
com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存
com.mysql.cj.protocol.a.result.ResultsetRowsCursor:游标查询,将结果集分批拉取到内存,按照fetchSize大小拉取,会占用当前连接直到连接关闭。在mysql那边会建立一个临时表写入磁盘(查询结束后由mysql回收处理),会导致mysql server磁盘io飙升。
com.mysql.cj.protocol.a.result.ResultsetRowsStreaming:流式查询,将结果集一条一条的拉取进内存,比较依赖网络,可能会造成网络阻塞。占用当前mysql连接。
所以在普通查询大数据量时如果JVM内存不够用会出现OOM异常。如下测试方案
数据量20w,一条数据大概2K。
虚拟机参数 -Xmx256m -Xms256m
(1)普通查询,大概接近200多M就GC释放
(2)