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时钟稍微稍微缓冲一下,要不量大可能会卡操作系统界面操作
由于文件的数据量很大,有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时钟稍微稍微缓冲一下,要不量大可能会卡操作系统界面操作
相关文章推荐
- 【转载】struts+spring+hibernate无法插入数据库数据的问题
- struts+spring+hibernate无法插入数据库数据的问题
- Spring、Hibernate 数据不能插入到数据库问题解决
- Spring、Hibernate 数据不能插入到数据库问题解决
- Junit测试spring hibernate产生javaw.exe异常的问题解决
- Hibernate/Spring/Struts架构使用OpenSessionInView的问题
- 关于Spring/Hibernate 3.x升级4.x的小问题
- 配置Spring+struts2+hibernate时遇到的问题
- Spring/Hibernate 应用中常见的性能问题,以及对应的解决方案
- 解决Spring和Hibernate整合时HQL查询语句乱码问题
- SpringBoot框架因post数据量过大没反应问题(踩坑)
- hibernate整合spring开发的时候遇到的一些小问题
- hibernate与spring整合的问题
- hibernate,spring问题及解决
- Spring mvc + hibernate问题总结
- Spring+hibernate中的问题解决:java.lang.ClassCastException: $Proxy6 cannot be cast to com.mqEsb.service.imp
- spring3.0.5 和hibernate3.6整合问题之java.lang.ClassNotFoundException: org.objectweb.asm.Type
- Spring 与hibernate整合过程中出现的一些问题
- struts2,hibernate4,spring3配置时问题汇总及解决办法
- MyEclipse下完美解决Hibernate 3.2与Spring 2.0+冲突问题