读取大量数据时数据时内存溢出,怎样分批读取?

qingfengyueshen 2011-04-22 09:53:19
在写一个程序更新某数据内某条内容时,(用的数据库是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的方法)谢谢各位大神。
...全文
1338 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang1986614 2011-04-25
  • 打赏
  • 举报
回复
重新设置服务器内存大小!
work_sunzh 2011-04-25
  • 打赏
  • 举报
回复
上面的代码好像不对:
session对象.flush();
session对象.clear();
work_sunzh 2011-04-25
  • 打赏
  • 举报
回复
你当前更新操作,应该只更新了缓存中的数据,并没有真正持久化到数据库,
应该设一个变量,记录你已更新了多少对象,如果达到某个值如1000,就清一下缓存,强制把数据更新到数据库
find.flush();
find.close();
wangjn1982 2011-04-25
  • 打赏
  • 举报
回复
抱歉,少了一个<=

SELECT * FROM (SELECT columnName,rownum num
FROM tableName)
where num >= startNum and num <= endNum)
wangjn1982 2011-04-25
  • 打赏
  • 举报
回复
大数据量可以利用rownum进行分批次查询

SELECT * FROM (SELECT columnName,rownum num
FROM tableName)
where num >= startNum and num endNum)
zilang629 2011-04-25
  • 打赏
  • 举报
回复
如果你想做到一次性更新这个表的话,唯一办法就是建立一个缓存表,你的操作针对缓存表进行操作,操作方法最好是存贮过程,因为毕竟的经常性动作。当缓存表操作结束以后,对应缓存表更新主表。个人观点仅供参考~!
bawgiitx 2011-04-24
  • 打赏
  • 举报
回复
存储过程可以,不过麻烦


rs = find.getResult();// 得到返回的结果集
while (rs.next()) {
find = new Bean();
//////// 试下
find.flush();
find.close();
}
qingfengyueshen 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aqszhuaihuai 的回复:]

只更新需要更新的记录,使用sql
没必要把所有的记录全部查出,使用java代码来判断是否更新哪些记录
最好绑定变量
[/Quote]
但我要从数据库里拿出原来的某个内容,然后经过一个自己写的匹配算法得到新的内容再更新数据库,这过程数据库能做?我能把我自己写的匹配算法让数据库帮我执行?
zwyancc 2011-04-23
  • 打赏
  • 举报
回复
String str="select id,content,name from Plan";

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

这吗 做的 啥事没有
小绵羊 2011-04-23
  • 打赏
  • 举报
回复

楼主这是打算自己开发个数据库呢?
这些事交给数据库做就好了
kai27ks 2011-04-22
  • 打赏
  • 举报
回复
你设置成10条加一次不行么?或者加个缓存啊?
Laughing 2011-04-22
  • 打赏
  • 举报
回复
只更新需要更新的记录,使用sql
没必要把所有的记录全部查出,使用java代码来判断是否更新哪些记录
最好绑定变量
龙四 2011-04-22
  • 打赏
  • 举报
回复
刚才一个帖子已经说了,在update里用where条件,本来该是数据库做的事情不要用你的程序去做

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧