日期:2014-05-17  浏览次数:20881 次

读取大量数据时数据时内存溢出,怎样分批读取?
在写一个程序更新某数据内某条内容时,(用的数据库是sql2000)发生java.lang.OutOfMemoryError: Java heap space错误,具体代码如下:
public void Update(Hashtable inputData, Hashtable outputData,
HttpSession mySession){
Bean find=new Bean();//封装了连接数据库等操作
String str="select id,content,name from Plan";
String content;
String oldname;//存放表中原来的名字
String newname;//存放新的名字
APlan tp=new APlan();
ResultSet rs;
int fail=0;
try{
find.setstatement(str);//设置查询语句
rs=find.getResult();//得到返回的结果集
while(rs.next()){
content=rs.getString("content");//获得表中某一的数据,然后匹配出新的名字
oldname=rs.getString("name");//获得旧的名字
newname=tp.MatchSortname(content);//匹配出新的名字
if(!oldsortname.equals(newsortname)){//如果旧的名字与新名字不相等,进行更新
str="update Plan set name='"+newname+"' where id='"+rs.getString("id")+"'";
find.setQuerystatement(str);//设置更新语句
find.updataRecord();//更新
if(find.isRollbackboon())//检查是否更新成功
fail++;
}
}
}catch(Exception e){
e.printStackTrace();
}

当运行这段代码是,刚开始的几十条数据是可以更新的,但是,当数据量达到一定程度的时候,就会发生java.lang.OutOfMemoryError: Java heap space
我个人认识这是这段代码所花费的内存太多了,愿意可能在于数据量太多或者匹配新名字的时候占用太多数据,我暂时没有想到新的匹配算法,想在拿出数据时改进,请问各位能否分配读出Plan表中的数据,然后再分配更新,这样会不会有效果?有效果该怎么分配读出?又或者有什么其他方法解决这个问题(PS:尽量不要用增加heap space的方法)谢谢各位大神。

------解决方案--------------------
刚才一个帖子已经说了,在update里用where条件,本来该是数据库做的事情不要用你的程序去做
------解决方案--------------------
只更新需要更新的记录,使用sql
没必要把所有的记录全部查出,使用java代码来判断是否更新哪些记录
最好绑定变量
------解决方案--------------------
String str="select id,content,name from Plan";

你更新内存溢出 还是 查数据 溢出 你 就先查出 10000 更新10000 你有多些数据 我现在 是30w-40w

这吗 做的 啥事没有
------解决方案--------------------
如果你想做到一次性更新这个表的话,唯一办法就是建立一个缓存表,你的操作针对缓存表进行操作,操作方法最好是存贮过程,因为毕竟的经常性动作。当缓存表操作结束以后,对应缓存表更新主表。个人观点仅供参考~!
------解决方案--------------------
抱歉,少了一个<=
Java code

SELECT * FROM (SELECT columnName,rownum num
                    FROM tableName)
        where num >= startNum and num <= endNum)