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