jdbc底层驱动加载大量数据机制防止内存溢出--Mysql
一。数据结果集——三种读取方式
1.流的形式,一次查询,结果集分多次获取,通信一次读一行。也就是while(rs.next)一次从服务器端获取一次 结果集数据保存在RowDataCursor对象中RowDataDynamic
优点:相当于把表中的数据分多次读取,直到读取完,完美的解决了内存溢出的问题
缺点:增加了通信的开销,一张表读取完可能要完成很多次的通信
配置方式:stmt.enableStreamingResults();或者stmt.setFetchSize(Integer.MIN_VALUE)只需要一行代码即可。也不需要在url附带参数
2.全部读取, 一次查询,结果集一次全部加载完毕,无论有多少数据都全部加载。结果集数据保存在RowDataCursor对象中RowDataStatic
优点:减少了通信开销,性能最优
缺点:可能造成jvm内存溢出
默认就是这种方式。不需要配置任何参数
3.使用游标读取, 一次查询,结果集分多次获取,通信一次读取多行。结果集数据保存在RowDataCursor对象中
平衡了上面的两种方式,而且还不会出现内存溢出
使用方式:第一种方式:jdbc:mysql://192.168.5.240:3306/turbo_2?useCursorFetch=true&defaultFetchSize=4 只需要配置url附带一些参数就行。所有的statement都会使用游标方式。第二种方式:url参数配置jdbc:mysql://192.168.5.240:3306/turbo_2?useCursorFetch=true
代码中配置stmt.setFetchSize(大于0的参数)
二。RowDataDynamic RowDataStatic RowDataCursor的区别
这三个对象都是保存结果集的,唯一不同的是结果集的保存形式。
RowDataStatic 默认的结果集保存形式,里面保存了一次查询所有的结果数据。数据量可能会很大
RowDataDynamic 只保存一个当前的结果集,当调用next()方法时候,立刻去获取下一条数据
RowDataCursor 保存了结果集的一部分,当调用next()时候,如果当前的这批数据还没有到末尾(整张表的末尾),就再发一次请求获取下一批数据。
参考地址:https://blog.csdn.net/lypeng13/article/details/121136104