mysql游标处理⼤批量数据问题
今天在类MYSQL数据库使⽤游标(spring的jdbcTemplate)读取⼤批量数据(⼏百万)的时候,发现系统的内存飙升,⼀直到内存溢出,⽽程序并没有执⾏到具体的处理逻辑上。
同样的程序,在ORACLE是可以正常执⾏的,所以可以确定程序本⾝是没问题的,但MYSQL的处理是将数据全部读取出来后才做处理。源程序如下,test表500w,类MYSQL数据库直接执⾏,直到内存溢出都不会打印出东西:
jdbcTemplate.query("select * from test", rs->{
System.out.println(rs);
});
解决办法:
jdbcTemplate.setFetchSize(Integer.MIN_VALUE);
在查询前,设置上fetchSize,就可以游标正常处理数据了。
注:
后⾯⽹上了下,⼀共有3种⽅法可以使⽤:
1、当statement设置以下属性时,采⽤的是流数据接收⽅式,每次只从服务器接收部份数据,直到所有数据处理完毕,不会发⽣JVM OOM setResultSetType(ResultSet.TYPE_FORWARD_ONLY);
jdbctemplate查询一条数据setFetchSize(Integer.MIN_VALUE);
2、调⽤statement的enableStreamingResults⽅法。封装了第⼀种⽅法的实现
3、设置连接属性useCursorFetch=true

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。