Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
使用Spring/Hibernate的批量插入_Hibernate_Spring_Bulkinsert - Fatal编程技术网

使用Spring/Hibernate的批量插入

使用Spring/Hibernate的批量插入,hibernate,spring,bulkinsert,Hibernate,Spring,Bulkinsert,我在我的应用程序中使用了Spring/Hibernate的混合(没有任何原创)。对于给定的功能,我必须将CSV文件的内容导入到Oracle DB的表中。 现在,我只是创建对象,我做了 HibernateTemplate.saveOrUpdate 在它们中的每一个上(我需要检索它们新分配的Id) 然后,使用Spring事务API,事务在方法末尾发生 一切正常,除了性能,这对5000个对象是正确的,但对100000个对象不是正确的 所以我想找一些想法来加速这件事。我听说过Hibernate的

我在我的应用程序中使用了Spring/Hibernate的混合(没有任何原创)。对于给定的功能,我必须将CSV文件的内容导入到Oracle DB的表中。 现在,我只是创建对象,我做了

   HibernateTemplate.saveOrUpdate
在它们中的每一个上(我需要检索它们新分配的Id)

然后,使用Spring事务API,事务在方法末尾发生

一切正常,除了性能,这对5000个对象是正确的,但对100000个对象不是正确的


所以我想找一些想法来加速这件事。我听说过Hibernate的批量插入,但找不到任何可靠的参考。有人能给我一些想法来执行这个具有更高性能的导入吗?

您也可以考虑使用它作为大容量操作的设计。

StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();

您可以尝试的简单方法是刷新并清除会话,例如每100个对象

所以执行

session.flush();
session.clear();
每插入100或1000次

这将刷新并清除hibernate会话,并阻止它变得太大(可能是您的100000个对象花费这么长时间的原因)

此外,如果您使用的是标识标识符生成器,hibernate将自动关闭批插入。批量插入将提高性能。您还需要指定hibernate.jdbc.batch_size配置属性,该属性相当于您的时间编号为100


曼宁对Hibernate的Java持久性是这本书的源头(好书——无数次拯救了我的皮肤)。

有时候,一个ORMapper不是一把合适的钉子锤。尤其是批处理操作通常使用普通的旧JDBC来执行。这当然取决于各种条件,但您至少应该将其视为一种选择,并比较两种方法的性能。

这不仅仅是一个数据库插入性能问题;如果您正在创建数以万计的对象,并且没有执行刷新,则Hibernate会话将一直增长,直到内存耗尽。

这里并不意味着是一个傻瓜,但是关于这一点的文档非常简洁,只需5分钟即可阅读:感谢您提供的链接,这正是我要寻找的。我以前做过一些研究,但没有找到它,但我是一个在Hibernate文档中挖掘的新手。以下是新链接: