带弹簧/休眠的散装插件

时间:2009-08-03 13:40:41

标签: hibernate spring bulkinsert

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

   HibernateTemplate.saveOrUpdate
每个人都有

(我需要检索他们新分配的Id)

然后使用Spring事务API在事务结束时进行事务。

一切正常,但性能除外,这对于5000个物体来说是正确的,但不是100 000个......

所以我寻找加速这些东西的想法。我听说过Hibernate的批量插入,但找不到任何可靠的引用。任何人都可以给我一些想法,以更高的性能执行此导入吗?

4 个答案:

答案 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会话将会增长,直到内存不足为止。