java - Spring Hibernate MySQL- 50k 插入耗时 20 分钟

标签 java mysql spring hibernate batch-processing

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

任何人都可以提供一些关于我可能做错了什么的见解吗?我启用了 hibernate 批处理大小并将其设置为 50,我还能做些什么来减少这个荒谬的插入时间?

最佳答案

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

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

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

我的 2 美分

关于java - Spring Hibernate MySQL- 50k 插入耗时 20 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155178/

相关文章:

php - MySql - 不同服务器中表的大小写敏感问题

php - 只能获取 $row ['id' 的一个值]

java - 提供 BufferedImage 时 Spring MVC 内容协商失败

java - GetSerializableExtra 返回 null

java - 尝试使用 Java 中的可执行文件运行文件

java - 使用 Spring、Hibernate 和 LocalSessionFactoryBuilder 配置 sessionFactory

java - Spring Data JPA - 在显式删除子项后加载父项返回已删除子项的子项集合

java - Spring 批处理 - 跳过 MyException 停止所有其他异常

mysql - 如何对sql表中时间类型的不同值求和

java - Spring myBatis 强制将 ZonedDateTime 保存在系统默认时区,如何防止?