Spring Hibernate MySQL- 50k插入需要20分钟

时间:2013-08-09 20:33:21

标签: java mysql spring hibernate batch-processing

我一直在使用最新的appfuse作为基础的项目。我已经扩展了很多模型,特别是用户,以适应我正在做的一些事情,其中​​一个是添加一些列表给附加了较大列表的用户,这是一个例子: 用户 - > LeadLists(可能是100左右) - >潜在顾客(超过50k) 这就是我的问题开始的地方。我有一个进程工作,用户上传CSV我解析为Lead对象并将它们添加到列表然后添加到用户然后保存用户并让级联保存执行其工作。但是一旦保存起火,它需要20分钟或更长时间才能完成,并且通常会出现permGen内存错误... 问题#2是一​​旦他们实际上在DB中我根本无法显示它们而没有得到另一个permGen内存不足错误。

任何人都可以提供一些有关我可能做错的见解吗?我启用了hibernate批量大小并将其设置为50,我还能做些什么才能让这个荒谬的插入时间缩短?

1 个答案:

答案 0 :(得分:3)

您是否使用Hibernate批处理编写了最佳实践代码? 如果没有,请检查link 如果是的话,你试图一次性写出一个User + LeadLists(100)+ Leads(50k)(50K项目!!!那不是花生!)你有这样的选择:

  1. 将所有内容移至平面JDBC(ORM有时不是批处理编程的最佳选择)可能是一个很好的解决方案,但需要您重写代码的某些部分,
  2. 转到StatelessSession(只是为了给它一个机会),但我认为PermGen错误就在眼前,
  3. 增加PermGen空间 - 例如关于对象维度的一些统计信息 - 可以解决PermGen问题,但不能解决问题

  4. 剧烈:转向Spring-batch,用于执行大量数据批量转换的框架。可能你会减少很多节省时间,但肯定会解决PermGen空间(真正的问题,IMO。慢速程序比崩溃和丢失数据的程序好)

  5. 我的2美分