我在我的应用程序中使用混合Spring / Hibernate(没有原创)。对于给定的功能,我必须将CSV文件的内容导入到Oracle DB的表中。 现在,我正在创建对象,我做
HibernateTemplate.saveOrUpdate
每个人都有(我需要检索他们新分配的Id)
然后使用Spring事务API在事务结束时进行事务。
一切正常,但性能除外,这对于5000个物体来说是正确的,但不是100 000个......
所以我寻找加速这些东西的想法。我听说过Hibernate的批量插入,但找不到任何可靠的引用。任何人都可以给我一些想法,以更高的性能执行此导入吗?
答案 0 :(得分:7)
你可能尝试的简单方法是刷新并清除会话说每100个对象......
所以执行
session.flush();
session.clear();
每100或1000个插页。
这将刷新并清除hibernate会话并阻止它变得太大(可能为什么你的10万个对象需要这么长时间)。
此外,如果你正在使用身份标识符生成器,hibernate会默默地关闭批量插入。批量插入将提高性能。您还需要指定hibernate.jdbc.batch_size配置属性,该属性相当于您的100个时间编号。
Manning的Java Persistence with Hibernate是这个的源头(好书 - 多次保存我的皮肤)。
答案 1 :(得分:6)
您也可以考虑使用StatelessSession,因为它是专为批量操作而设计的。
StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();
答案 2 :(得分:3)
有时,ORMapper不是钉子的正确锤子。特别是批处理操作通常使用普通的JDBC进行更高效的执行。这当然取决于各种条件,但您至少应将此作为一种选择,并比较两种方法的表现。
答案 3 :(得分:0)
这不仅仅是数据库插入性能问题;如果您要创建数万个对象而不执行刷新,Hibernate会话将会增长,直到内存不足为止。