码匪周子

 

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

posted on 2022-06-15 10:15  码匪周子  阅读(299)  评论(0编辑  收藏  举报

导航