android内存溢出 gps,ResultSet内存溢出OutOfMemory问题 札记

ResultSet内存溢出OutOfMemory问题

错误信息如下:

jdbc在操作oracle海量数据的时候用ResultSet获取所有的返回数据出现内存溢出

处理:

出错的原因是ResultSet用的是可滚动结果集,正常情况下ResultSet是指针指向数据库的数据,本身是不存储数据库的数据的,默认情况下就算是提交的sql能查询处上亿条的数据也是不消耗内存的,但是如果用的是可滚动结果集的ResultSet情况就不一样了,ORACLE

是不支持可滚动结果集的,那么我们用JDBC得到一个可滚动的结果集就是由JDBC自己支持的,也就是说结果集是要存放在内存中的,所以在海量数据的情况下也就是要消耗大量内存的,因此造成内存溢出也就是正常的了,所以如果是海量数据的话就不要用可滚动结果集就可以了

JDBC利用游标分页查询

a4c26d1e5885305701be709a3d33442f.pnga4c26d1e5885305701be709a3d33442f.pngpublicvoidgetData(String sql,intstartNo,intmaxCount){

a4c26d1e5885305701be709a3d33442f.png Connection conn=ConnectionUtil.getConnection();

a4c26d1e5885305701be709a3d33442f.pngtry{

a4c26d1e5885305701be709a3d33442f.png//conn.prepareStatement(sql,游标类型,能否更新记录);

a4c26d1e5885305701be709a3d33442f.png//游标类型:

a4c26d1e5885305701be709a3d33442f.png//ResultSet.TYPE_FORWORD_ONLY:只进游标

a4c26d1e5885305701be709a3d33442f.png//ResultSet.TYPE_SCROLL_INSENSITIVE:可滚动。但是不受其他用户对数据库更改的影响。

a4c26d1e5885305701be709a3d33442f.png//ResultSet.TYPE_SCROLL_SENSITIVE:可滚动。当其他用户更改数据库时这个记录也会改变。

a4c26d1e5885305701be709a3d33442f.png//能否更新记录:

a4c26d1e5885305701be709a3d33442f.png//ResultSet.CONCUR_READ_ONLY,只读

a4c26d1e5885305701be709a3d33442f.png//ResultSet.CONCUR_UPDATABLE,可更新a4c26d1e5885305701be709a3d33442f.pngPreparedStatement pstat=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

a4c26d1e5885305701be709a3d33442f.png//最大查询到第几条记录a4c26d1e5885305701be709a3d33442f.pngpstat.setMaxRows(startNo+maxCount-1);

a4c26d1e5885305701be709a3d33442f.png ResultSet rs=pstat.executeQuery();

a4c26d1e5885305701be709a3d33442f.png//将游标移动到第一条记录a4c26d1e5885305701be709a3d33442f.pngrs.first();

a4c26d1e5885305701be709a3d33442f.png//游标移动到要输出的第一条记录a4c26d1e5885305701be709a3d33442f.pngrs.relative(startNo-2);

a4c26d1e5885305701be709a3d33442f.pngwhile(rs.next())

a4c26d1e5885305701be709a3d33442f.png System.out.println(rs.getInt(1));

a4c26d1e5885305701be709a3d33442f.png }catch(SQLException e){

a4c26d1e5885305701be709a3d33442f.png e.printStackTrace();

a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png a4c26d1e5885305701be709a3d33442f.pnga4c26d1e5885305701be709a3d33442f.pngpublicvoidgetDataFromAll(String sql,intstartNo,intmaxCount){

a4c26d1e5885305701be709a3d33442f.png Connection conn=ConnectionUtil.getConnection();

a4c26d1e5885305701be709a3d33442f.pngtry{

a4c26d1e5885305701be709a3d33442f.png PreparedStatement pstat=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

a4c26d1e5885305701be709a3d33442f.png ResultSet rs=pstat.executeQuery();

a4c26d1e5885305701be709a3d33442f.png rs.first();

a4c26d1e5885305701be709a3d33442f.png rs.relative(startNo-1);

a4c26d1e5885305701be709a3d33442f.pnginti=startNo-1;

a4c26d1e5885305701be709a3d33442f.pngwhile(i

a4c26d1e5885305701be709a3d33442f.png System.out.println(rs.getInt(1));

a4c26d1e5885305701be709a3d33442f.png i++;

a4c26d1e5885305701be709a3d33442f.png rs.next();

a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png }catch(SQLException e){

a4c26d1e5885305701be709a3d33442f.png e.printStackTrace();

a4c26d1e5885305701be709a3d33442f.png }a4c26d1e5885305701be709a3d33442f.png }

2

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();

该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值