读书人

ResultSet内存溢出OutOfMemory有关问题

发布时间: 2012-08-29 08:40:14 作者: rapoo

ResultSet内存溢出OutOfMemory问题 札记

?

?

ResultSet内存溢出OutOfMemory问题

错误信息如下:?

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


处理:?

出错的原因是ResultSet用的是可滚动结果集,正常情况下ResultSet是指针指向数据库的数据,本身是不存储数据库的数据的,默认情况下就算是提交的sql能查询处上亿条的数据也是不消耗内存的,但是如果用的是可滚动结果集的ResultSet情况就不一样了,ORACLE 是不支持可滚动结果集的,那么我们用JDBC得到一个可滚动的结果集就是由JDBC自己支持的,也就是说结果集是要存放在内存中的,所以在海量数据的情况下也就是要消耗大量内存的,因此造成内存溢出也就是正常的了,所以如果是海量数据的话就不要用可滚动结果集就可以了

?

?

JDBC利用游标分页查询

ResultSet内存溢出OutOfMemory有关问题 札记/**
ResultSet内存溢出OutOfMemory有关问题 札记??*?一次只从数据库中查询最大maxCount条记录
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?sql?传入的sql语句
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?startNo?从哪一条记录开始
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?maxCount?总共取多少条记录
ResultSet内存溢出OutOfMemory有关问题 札记??*/
ResultSet内存溢出OutOfMemory有关问题 札记?public?void?getData(String?sql,int?startNo,int?maxCount){
ResultSet内存溢出OutOfMemory有关问题 札记??Connection?conn?=?ConnectionUtil.getConnection();
ResultSet内存溢出OutOfMemory有关问题 札记??try?{
ResultSet内存溢出OutOfMemory有关问题 札记//???conn.prepareStatement(sql,游标类型,能否更新记录);
ResultSet内存溢出OutOfMemory有关问题 札记//??????游标类型:
ResultSet内存溢出OutOfMemory有关问题 札记//???????ResultSet.TYPE_FORWORD_ONLY:只进游标
ResultSet内存溢出OutOfMemory有关问题 札记//???????ResultSet.TYPE_SCROLL_INSENSITIVE:可滚动。但是不受其他用户对数据库更改的影响。
ResultSet内存溢出OutOfMemory有关问题 札记//???????ResultSet.TYPE_SCROLL_SENSITIVE:可滚动。当其他用户更改数据库时这个记录也会改变。
ResultSet内存溢出OutOfMemory有关问题 札记//??????能否更新记录:
ResultSet内存溢出OutOfMemory有关问题 札记//???????ResultSet.CONCUR_READ_ONLY,只读
ResultSet内存溢出OutOfMemory有关问题 札记//???????ResultSet.CONCUR_UPDATABLE,可更新
ResultSet内存溢出OutOfMemory有关问题 札记???PreparedStatement?pstat?=?conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet内存溢出OutOfMemory有关问题 札记???//最大查询到第几条记录
ResultSet内存溢出OutOfMemory有关问题 札记???pstat.setMaxRows(startNo+maxCount-1);
ResultSet内存溢出OutOfMemory有关问题 札记???ResultSet?rs?=?pstat.executeQuery();
ResultSet内存溢出OutOfMemory有关问题 札记???//将游标移动到第一条记录
ResultSet内存溢出OutOfMemory有关问题 札记???rs.first();
ResultSet内存溢出OutOfMemory有关问题 札记//???游标移动到要输出的第一条记录
ResultSet内存溢出OutOfMemory有关问题 札记???rs.relative(startNo-2);
ResultSet内存溢出OutOfMemory有关问题 札记???while(rs.next())
ResultSet内存溢出OutOfMemory有关问题 札记????System.out.println(rs.getInt(1));
ResultSet内存溢出OutOfMemory有关问题 札记??}?catch?(SQLException?e)?{
ResultSet内存溢出OutOfMemory有关问题 札记???e.printStackTrace();
ResultSet内存溢出OutOfMemory有关问题 札记??}
ResultSet内存溢出OutOfMemory有关问题 札记?}
ResultSet内存溢出OutOfMemory有关问题 札记?
ResultSet内存溢出OutOfMemory有关问题 札记?/**
ResultSet内存溢出OutOfMemory有关问题 札记??*?从数据库中查询所有记录,然后通过游标来获取所需maxCount条记录
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?sql?传入的sql语句
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?startNo?从哪一条记录开始
ResultSet内存溢出OutOfMemory有关问题 札记??*?@param?maxCount?总共取多少条记录
ResultSet内存溢出OutOfMemory有关问题 札记??*/
ResultSet内存溢出OutOfMemory有关问题 札记?public?void?getDataFromAll(String?sql,int?startNo,int?maxCount){
ResultSet内存溢出OutOfMemory有关问题 札记??Connection?conn?=?ConnectionUtil.getConnection();
ResultSet内存溢出OutOfMemory有关问题 札记??try?{
ResultSet内存溢出OutOfMemory有关问题 札记???PreparedStatement?pstat?=?conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet内存溢出OutOfMemory有关问题 札记???ResultSet?rs?=?pstat.executeQuery();
ResultSet内存溢出OutOfMemory有关问题 札记???rs.first();
ResultSet内存溢出OutOfMemory有关问题 札记???rs.relative(startNo-1);
ResultSet内存溢出OutOfMemory有关问题 札记???int?i?=?startNo-1;
ResultSet内存溢出OutOfMemory有关问题 札记???while(i?<?startNo?+?maxCount-1?&&?!rs.isAfterLast()){
ResultSet内存溢出OutOfMemory有关问题 札记????System.out.println(rs.getInt(1));
ResultSet内存溢出OutOfMemory有关问题 札记????i++;
ResultSet内存溢出OutOfMemory有关问题 札记????rs.next();
ResultSet内存溢出OutOfMemory有关问题 札记???}
ResultSet内存溢出OutOfMemory有关问题 札记??}?catch?(SQLException?e)?{
ResultSet内存溢出OutOfMemory有关问题 札记???e.printStackTrace();
ResultSet内存溢出OutOfMemory有关问题 札记??}
ResultSet内存溢出OutOfMemory有关问题 札记?}?

?

?

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(); 该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。

?

?

?

读书人网 >软件架构设计

热点推荐