问题:
jdbc在操作oracle海量数据的时候用resultset获取所有的返回数据出现内存溢出。
原因:
出错的原因是resultset用的是可滚动结果集,正常情况下resultset是指针指向数据库的数据,本身是不存储数据库的数据的,默认情况下就算是提交的sql能查询处上亿条的数据也是不消耗内存的,但是如果用的是可滚动结果集的resultset情况就不一样了,oracle 是不支持可滚动结果集的,那么我们用jdbc得到一个可滚动的结果集就是由jdbc自己支持的,也就是说结果集是要存放在内存中的,所以在海量数据的情况下也就是要消耗大量内存的,因此造成内存溢出也就是正常的了,所以如果是海量数据的话就不要用可滚动结果集就可以了
resultset 接口提供了一整套的定位方法:
public boolean absolute(int row); 该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库
游标移动到指定的行,参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算不是相对的行号。
public boolean relative(int rows); 该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。
public boolean first(); 该方法的作用是将当前行定位到数据库记录集的第一行。
public boolean last(); 该方法的作用刚好和first()方法相反。
public boolean isfirst(); 该方法的作用是检查当前行是否记录集的第一行,如果是返回true, 否则返回false。
public boolean islast(); 该方法的作用是检查当前行是否记录集的最后一行,如果是返回true ,否则返回false。
public void afterlast(); 该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面,如果该记录集不包含任何的行该方法不产生作用。
public void beforefirst(); 该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面,如果记录集不包含任何的行该方法不产生作用。
public boolean isafterlast(); 该方法检查数据库游标是否处于记录集的最后面,如果是返回true ,否则返回false。
public boolean isbeforefirst(); 该方法检查数据库游标是否处于记录集的最前面,如果是返回true ,否则返回false。
public boolean next(); 该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方法将会使数据库游标定位到记录集的第一行,第二次使用next()方法将会使数据库游标定位到记录集的第二行,以此类推。
public boolean previous(); 该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。