8

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

   HibernateTemplate.saveOrUpdate

在他们每个人上(我需要检索他们新分配的 ID)

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

一切正常,除了性能,这对于大约 5000 个对象是正确的,但对于 100 000 个对象不正确......

所以我寻找加速这些东西的想法。我听说过 Hibernate 的批量插入,但找不到任何可靠的参考。谁能给我一些想法以更好地执行此导入?

4

4 回答 4

7

您可能会尝试的简单方法是每 100 个对象刷新和清除会话...

所以执行

session.flush();
session.clear();

每 100 或 1000 次插入。

这将刷新和清除休眠会话并阻止它变得太大(可能是为什么你的 100 000 个对象需要这么长时间)。

此外,如果您使用身份标识符生成器,​​休眠将静默关闭批量插入。批量插入将提高性能。您还需要指定 hibernate.jdbc.batch_size 配置属性,相当于您的 100 一次。

Manning 的 Java Persistence with Hibernate 是这本书的来源(好书 - 多次拯救了我的皮肤)。

于 2009-08-03T14:45:58.713 回答
6

您也可以考虑使用StatelessSession,因为它是为批量操作而设计的。

StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();
于 2009-08-03T13:50:00.023 回答
3

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

于 2009-08-04T18:20:15.243 回答
0

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

于 2010-02-09T18:14:37.700 回答