我用java查询数据时,因数据的行数比较多,每次查询都出现Erroring: batchId[44] message[java.lang.OutOfMemoryError: Java heap space]错误。
如果我分多次查询的话该怎么实现???

解决方案 »

  1.   

    就看你的SQL怎么写了, 或者加大你Java的堆内存.找找-Xms和-Xmx两个参数的用法.
      

  2.   

    现有A,B两张表:
    如果A个表中有100W多条记录,怎么通过java来实现把A表的数据放到B表中
      

  3.   

    大家谁知道把一个有100W记录的表通过java放到另张表里需要多长时间???有没有高效的查询方法,或在java里动些手脚,总之需要的时间短就可以了
      

  4.   

    什么数据库?大型数据库都支持存储过程。你用JAVA调用数据库的存储过程。这样,Java前端就不会有数据压力了。
      

  5.   

    现有A,B两张表: 
    如果A个表中有100W多条记录,怎么通过java来实现把A表的数据放到B表中

    100万的话,大致3分钟吧!我给你些提示
    1 读取和写入用2个Connection
    2 写入启用Batch Insert 批量写入,每2000行提交一次
    3 如果你对线程熟悉,读写过程可以做成多线程,但数据来源和写入操作做成独立的。也就是货物来源和货物存放地是分别一个,搬运工很多。批量写入速度很快,大致比每一个提交一次快20倍以上吧!
      

  6.   

    主要是一个 addBatch()方法,和 executeBatch() 提交;
      

  7.   

    如果你是Oracle的话,我这里有OracleCopy 整套应用,我自己写的,用了2年了,用来复制2个Oracle的数据的多张表。
      

  8.   

    对了,提示你, message[java.lang.OutOfMemoryError: 不要想着把数据都读出来再进行操作, 独一行,那面写一行。 启动批量提交,速度很快的。10个线程比单线程也就快2-4倍吧! 
      

  9.   

    呵呵!请看一下数据库的模式方面的知识,
    一个结果集是已经生成的,保存在某个单独的空间,在一个事务里面是不会随着你的读取而动态变化。
    而且,就算最糟糕的情况,你可以锁定目前的数据,不影响新数据插入的,也就是在read_duty 模式下也能正常读取。
      

  10.   

    你说的是查询出所有结果集分批提交吗?还是下面的步骤
    1.查询1~1000条数据select top 1000 * from table
    2.addBatch
    3.executeBatch
    4.查询1000~2000条数据select top 1000 * from table where id not in (select top 2000 id from table)
    5.addBatch
    6.executeBatch
    .........
      

  11.   

    你根本没明白我说的select * from tablewhilr(rs.next){
      // read
      // addBath()
      if(){
        executeBatch();
      }
    }
    Over;占用2个Connection, 一个读,一个写。不要在一个Connection里面做。
      

  12.   

    你把 insert的部分全部屏蔽,专心读取,看看是否是读取部分造成的游标问题如果能运行,那就是 insert部分的pstat 和 rs 你没有关闭否则, 读取部分有没有关闭的rs, 其实读取只需要一个rs就可以了!
      

  13.   

    直接在java里写 insert into tablename select column_name from tablename
    100多W数据 几秒就搞定了