1

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

谁能提供一些关于我可能做错了什么的见解?我已经启用了休眠批量大小并将其设置为 50,我还能做些什么来缩短这个荒谬的插入时间?

4

1 回答 1

3

您是否使用 Hibernate 批处理最佳实践编写代码?
如果没有,请检查此链接
如果是,并且您尝试一次性编写单个 User+LeadLists(100)+Leads(50k) (是 50K 项!!!这不是花生!)您有以下选择:

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

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

我的 2 美分

于 2013-08-09T20:57:19.903 回答