前言
最近做性能优化,然后发现mysql的游标查询不生效,写一个博客记录一下啊
错误理解:
- 认为mysql的jdbc,使用了statement.setFetchSzie(),以为只要使用了这个方法设值,默认就会使用游标查询或者流式查询,但看了源码其实不是
- 自己测试性能的时候,发现mysql大数据获取会存在com.mysql.jdbc.bytearrayrow内存溢出,当初以为是游标查询也会出现的内存溢出,其实不是,因为根本也没开启到游标查询
解决方案:
概念:
- RowDataStatic
默认的结果集保存形式,里面保存了一次查询所有的结果数据。数据量可能会很大 - RowDataDynamic
只保存一个当前的结果集,当调用next()方法时候,立刻去获取下一条数据 - RowDataCursor
保存了结果集的一部分,当调用next()时候,如果当前的这批数据还没有到末尾(整张表的末尾),就再发一次请求获取下一批数据。
源码解析
- 查看了mysql的jdbc源码之后才发现,使用哪个结果集来创建resutSet,是有不同判断的
1.1.也就是说明,如果要使用RowDataCursor游标查询的话,必须在url参数中设置UseCursorFetch = true的参数,以及fetchSize需要设置(可以使用statement设置,也可以在参数中设置)
1.2 如果要使用RowDataDynamic 流查询的话,可以使用statement.setFetchSize()的方法,但是设置的值,必须是Integer.MIN_VALUE值,这样才可以使用单行流查询
1.3 若都不满足,而使用readSingleRowSet方式查询了,就是RowDataStatic对象(之前测出来内存溢出也是因为这个问题)