ResultSet需要返回大数据集,用以导出EXCEL,还是当数量上万之后,遍历速度非常慢,请问有什么好办法吗?大概代码: PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery(); 
while (rs.next()) {
//这里处理,但是10000条记录,遍历非常之慢
rs.getAsciiStream(1);
   
}

解决方案 »

  1.   

    如果瓶颈只是在传递。而不是查询本身,没有什么特别好的办法。
    比如,可以分线程,多个查询,分别输出到不同的excel文件中,类似分页。
      

  2.   

    当然慢啦ResultSet rs = pstmt.executeQuery(); 
    while (rs.next()) { 
    //这里处理,但是10000条记录,遍历非常之慢 
    rs.getAsciiStream(1); 
    需要占用多少jvm的内存,想过没有,而且很可能多来几个人查询就内存溢出,所以一般的都提倡分页查询
      

  3.   

    如果查询的数据量过大时,ResultSet是可以设置其存储长度以保证效率的!建议看一下它的API。 
      

  4.   

    如果是查询是用分页的,但是这个功能是批量导出,所以,对客户的操作来说,是不分页的。数据库这一层倒不是问题,我测试了,2万个查询也就2 ~3秒,就是rs.next非常的慢,或者,就不用resultset,换其他的方法?
      

  5.   

      不知道你的数据量多大2~3秒的话应该可以接受吧。。
        使用JDBC操作最快了
      

  6.   

    你是不是在while里面取一条就往excel里面加一条数据了啊?
    你可以先把所有数据放在数组里面,然后再1000条写一次Excel对了内存调大点。
      

  7.   

    1.分次查询,依次写入文件。2.如果还不行,就用下面这个:
      1)请求画面 --> 提供出力按钮,用于启动后台线程,执行出力处理。
      2)处理状态查询画面 --> 状态显示,已完成的,提供下载。
      

  8.   

    还在测试中,目前发现这样的规律:
    主要是由于有其中的两个大字段,一个是varchar2(500),一个是clob字段,如果rs中不含这两个字段,那还是相当快,否则,很慢。
    测试下来,是200条大概8秒;用了pstmt.setFetchSize(100);还是不起作用;但是,如果是mssql的,却速度很快,难道是oracle的result有问题?
      

  9.   

    JdbcRowSet jrs=new JdbcRowSetImpl(rs);
    while(jrs.next()){
    i++;
    if(i%100 ==0){
    System.out.println("0111000第"+ i+"次");
    Test.printNow();
    }
    }换成这样也还是很慢的。
      

  10.   

    CachedRowSet jrs=new CachedRowSetImpl();
    jrs.setCommand(sbSql.toString());
    jrs.setReadOnly(true);
    jrs.setFetchSize(1000);
    Test.printNow("执行前");
    jrs.execute(conn);
    Test.printNow("执行后");
    while(jrs.next()){
    i++;
    if(i%100 ==0){
    System.out.println("0111000第"+ i+"次");
    Test.printNow();
    }
    }用CachedRowSet,时间是耗在jrs.execute(conn);循环的速度非常快。