【问题标题】:jpa spring boot - hibernate insert slowjpa spring boot - 休眠插入慢
【发布时间】:2017-08-03 13:21:45
【问题描述】:

我有三个要保存到数据库的实体列表。

总共有大约 1000 个实体必须持续存在。

entityRepo.save(EntityList);

但是,这需要 4-5 分钟才能完成。 - 我注意到它在插入之前做了一些选择,我认为它是休眠脏检查以查看它是否需要更新或插入。

无论如何禁用它并提高休眠插入的速度?

一直在研究刷新,但在一次保存整个列表时不知道该怎么做?

【问题讨论】:

  • 不要将 save 与列表一起使用,而是自己迭代。打开批量插入,并在循环每个 x(例如 50)对象时刷新和清除 enentity manager。每次持久化一个对象时,hibernate 都会检查 所有 一级缓存中的实体,对于 1 个实体,这并不明显,但对于 1000 个实体,它会非常快地倾斜。将其限制为 50 并在两者之间刷新/清除有助于解决此问题。

标签: database hibernate spring-boot insert spring-data-jpa


【解决方案1】:

当您说脏检查导致从数据库读取时,您是正确的。如果您使用标准的 Hibernate Session 来持久化您的实体,它们将由 Hibernate 照常管理。

如果您想避免这种情况,最简单的方法可能是打开StatelessSession 并使用org.hibernate.StatelessSession.insert。这不使用一级缓存,因此不需要脏检查实体。

您可以通过调用SessionFactory#withStatelessOptions 来获得StatelessSessionBuilder 的实例来实现此目的。然后您可以拨打org.hibernate.StatelessSessionBuilder.openStatelessSession

【讨论】:

    【解决方案2】:

    如果所有实体都相同,那么您应该打开批量插入。这里有几篇文章可以帮助您入门。它主要只是添加一些配置。

    http://memorynotfound.com/hibernate-jpa-batch-insert-batch-update-example/ https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/batch/Batching.html

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2017-06-13
      • 2014-08-14
      • 1970-01-01
      • 2012-07-30
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多