我公司是做erp系统的,现在要求做一个款号转数的task,由于每天款号转数的数据量比较大,而且款号涉及的一些关联要也要进行转数,所以有时候会导致out of momery ,要进行修改! 原代码是用hibernate实现的, list = gzBma00160pDAO.getTransferData(Bma00160p.class,object); if(list!=null){ for(Iterator it = list.iterator();it.hasNext();){ Bma00160p newBma00160p = new Bma00160p(); BeanUtils.copyProperties(it.next(), newBma00160p); try{ Bma00160p bma00160p = bma00160pDAO.getBma00160p(newBma00160p.getBma00160pPK()); if(bma00160p!=null){ newBma00160p.setState(BaseObject.UPDATEMODE_MODIFY); }else{ newBma00160p.setState(BaseObject.UPDATEMODE_INSERT); } newBma00160p.setDlastmodifytime(nowtime); bma00160pDAO.saveObject(newBma00160p); }catch(Exception e){ ERPTaskErrorMailListener.addMessage("BMA00160P出错,代号: " + newBma00160p.getBma00160pPK()); LogUtils.warn("bma00160p error : " + newBma00160p); e.printStackTrace(); } } list.clear(); } 每个表查询转数的代码如上,每次都通过本地的对象get远程的对象,看有没有存在,有则update否则insert,这样如果数据量大,频繁的操作数据库是不是导致性能低下的原因呢?如果我换成jdbc,写sql语句一次性update 或 insert 会不会性能有所提升?但这样的话就要建立临时表去存放本地的数据给远程用... 望高手能给予解答,谢谢
2 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
感觉 化整为零 分批次 一股脑 转换 数据量大的化 肯定报溢出 以前导出Excel 就是数据量大 最后通过 改jvm大小 再分sheet 我想转换原理差不多 分批次
largeQ
TA贡献2039条经验 获得超7个赞
看了这个应该可以使用sql直接完成吧。
不同库可以使用远程datalink也可以实现
update bma00160p.Bma00160p t set state=BaseObject.UPDATEMODE_MODIFY
where t.pk in (select pk from gzBma00160p.Bma00160p where ....)
insert into bma00160p.Bma00160p () values
select ..., BaseObject.UPDATEMODE_INSERT as state from gzBma00160p.Bma00160p where ....
呵呵,你这个地方的list多大,我处理过一个表30W的记录也没见内存暴的情况,当然不是hibernate了,hibernate处理不过来。
- 2 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消