您的位置:首页 > 编程语言 > Java开发

Spring+Hibernate大数据量插入DB的问题。

2013-05-28 19:18 357 查看
先有这样一个功能,读取文件,并将文件的内容全部插入到DB中去。
由于文件的数据量很大,有2800000件。
下面是代码,我发现oe = orderEtdDAO.merge(oe);这句语句就会让内存不断的增加,处理到690000件左右的时候就会报错java heap space。而merge()方法已经是hibernate框架里的东西了。
while ((oe = reader.readModel()) != null) {
actualNumberOfRecords++;

if (actualNumberOfRecords % 5000 == 0)
System.out.println(actualNumberOfRecords);

oe = orderEtdDAO.merge(oe);//就是这一句会让内存激增。

if (actualNumberOfRecords % 50 == 0) {
orderEtdDAO.flush();
orderEtdDAO.clear();
}
oe = null;
}

--------------------------------
@SuppressWarnings("unchecked")
@Transactional
public M merge(M value) {
return (M) getHibernateTemplate().merge(value);
}

求教,问题出在哪里?如何解决?
已经扩大jvm可以使用的内存了。-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m

分析:

1、我找到一个办法,好像可以进行处理了。
就是加上 @Transactional(propagation=Propagation.REQUIRES_NEW)。
好像可以让他插入以后立即commit。
现在在test阶段,好像可以。

如果可以的话,谁能解释一下为什么?
为什么不commit的时候,会不断使用内存呢?我明明用了flush和clear,应该会吧内存的东西清掉吧。
究竟是什么东西没有清除呢?

2、其实这是一种比较安全的做法思想,具体批次1000条还是5000条,看你机器性能和对其他用户体验效果的测试,随意,反正一次条数越大速度越快,反之就整体时间会拉长。还有提交完一个批次,取下一批次,尽量SLEEP(5),给CPU时钟稍微稍微缓冲一下,要不量大可能会卡操作系统界面操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: