Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate MySQL-50k插入需要20分钟_Java_Mysql_Spring_Hibernate_Batch Processing - Fatal编程技术网

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

Java Spring Hibernate MySQL-50k插入需要20分钟,java,mysql,spring,hibernate,batch-processing,Java,Mysql,Spring,Hibernate,Batch Processing,我一直在使用最新的appfuse作为基础进行一个项目。。我已经扩展了很多模型,特别是用户模型,以适应我正在做的一些事情,其中之一是向用户添加一些附加了较大列表的列表,下面是一个示例: 用户->潜在客户列表(大约100个)->潜在客户(超过50k) 这就是我的问题开始的地方。我有一个工作流程,用户上传一个CSV,我将其解析为Lead对象并将其添加到列表中,然后添加到用户,然后保存用户并让cascade save完成其工作。然而,一旦保存触发,它需要20分钟或更长时间才能完成,并且通常会出现永久性内

我一直在使用最新的appfuse作为基础进行一个项目。。我已经扩展了很多模型,特别是用户模型,以适应我正在做的一些事情,其中之一是向用户添加一些附加了较大列表的列表,下面是一个示例: 用户->潜在客户列表(大约100个)->潜在客户(超过50k) 这就是我的问题开始的地方。我有一个工作流程,用户上传一个CSV,我将其解析为Lead对象并将其添加到列表中,然后添加到用户,然后保存用户并让cascade save完成其工作。然而,一旦保存触发,它需要20分钟或更长时间才能完成,并且通常会出现永久性内存错误。。。 问题#2是,一旦它们实际位于数据库中,我就无法显示它们,而不会出现另一个永久性内存不足错误


谁能告诉我我做错了什么?我已启用hibernate批处理大小并将其设置为50,我还可以做些什么来缩短这荒谬的插入时间?

您是否使用hibernate批处理最佳实践编写代码?
如果没有,请检查此项。
如果是,并且您正试图在一次快照中编写一个用户+潜在客户列表(100)+潜在客户(50k)(是50k个项目!!!这可不是小菜一碟!),您有以下选择:

  • 将所有代码移到平面JDBC(ORM有时不是批处理编程的最佳选择)可能是一个好的解决方案,但可能需要重写部分代码
  • 转到无状态会话(只是给它一个机会),但我认为PermGen错误即将出现
  • 增加PermGen空间(例如,根据有关对象维度的一些统计信息确定大小)可以解决PermGen问题,但不能解决速度慢的问题

  • Drastic:移动到SpringBatch,该框架用于执行大量数据的批量转换。您可能会节省大量时间,但可以肯定的是,您将解决PermGen空间问题(在我看来,真正的问题是速度慢的程序比崩溃和丢失数据的程序要好)


  • “我的2美分”

    您是否急切地加载列表中的所有元素?在@bellabax reply中可以找到一些不错的评论,但您是否考虑到您可能以交换问题告终的事实?内存空间不足,因此会不断移动到磁盘或其他位置,从而大大降低执行时间。@LGM:在运行应用程序的机器上,您可以控制它,但这不是最终的解决方案;如果5万变成10万会怎么样?你给你的电脑添加了更多的维生素?每一次硬件升级都需要为我们的客户或公司提供资金。IMO最好建立一个健壮的批处理编程,只有在绝对必要的情况下才使用硬件升级necessary@SotiriosDelimanolis正如bellabax所建议的那样,我正在使用Eanger loadingDustin,如果您能够完成复杂的Spring批处理设置,它可能是您的最佳选择。我最近做了一个将.cvs数据插入MySQL的小示例教程项目,但它比您现在所做的要简单得多。我使用了SpringBatch 2.2.0和Hibernate4,并将Hibernate和SpringBatch大小设置为100。我使用Spring批处理,但使用Hibernate会话工厂。在没有刷新、write()编码或批处理清除的情况下,我能够在大约10分钟内插入400000条记录,而没有缓存问题。如果有兴趣,我可以提供一些代码。谢谢你的帮助@bellabax Spring正在处理会话和其他事情,但我已经尝试按照您发布的链接上的步骤进行操作。我想写的是:User+LeadList(1)+Leads(50k)我在使用generic.save()方法,我可能会尝试写我自己的,并将负载分成1000?我知道Hibernate正在批处理,因为我可以让它出错,它会从“BatchingBatch.performExecution”中显示出来。我将从无状态会话开始尝试其他建议。如果我尝试使用SpringBatch,如何保持对象关系?由于Leads对象是需要批处理的对象,因此Spring批处理基于不同的概念,需要重新考虑批处理步骤(这就是我定义它的原因)。。。