代码之家  ›  专栏  ›  技术社区  ›  Laurent K

带弹簧/休眠的大容量插入

  •  8
  • Laurent K  · 技术社区  · 15 年前

    我在我的应用程序中使用的是一个混合的Spring/Hibernate(没有原始版本)。对于给定的特性,我必须将csv文件的内容导入到Oracle数据库的表中。 现在,我只需要创建对象

       HibernateTemplate.saveOrUpdate
    

    在它们中的每一个上(我需要检索它们新分配的ID)

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

    一切都很好,除了性能,这是正确的约5000的对象,但不是10万…

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

    4 回复  |  直到 9 年前
        1
  •  7
  •   Michael Wiles    15 年前

    您可能会尝试刷新和清除会话,比如说每100个对象…

    所以执行

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

    每100或1000个插入件。

    这将刷新并清除休眠会话,并阻止它变大(可能是为什么您的100000个对象需要这么长时间)。

    此外,如果您使用的是身份标识符生成器,那么Hibernate将自动关闭批插入。批量插入将提高性能。您还需要指定hibernate.jdbc.batch_-size配置属性,该属性相当于一个时间编号中的100。

    Manning用Hibernate的Java持久性是这个(伟大的书——保存我的皮肤无数次)的来源。

        2
  •  6
  •   Anti Veeranna    9 年前

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

    StatelessSession ss=sessionFactory().openStatelessSession();
    Transaction tx=ss.beginTransaction();
    
        3
  •  3
  •   Oliver Drotbohm    15 年前

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

        4
  •  0
  •   Ken Liu    14 年前

    这不仅仅是一个数据库插入性能问题;如果您要创建数万个对象而不执行刷新,则休眠会话将一直增长,直到您耗尽内存。