我有三个实体列表,想要保存到数据库中。
总共大约有1000个实体需要持久化。
entityRepo.save(EntityList);
然而,这需要4-5分钟才能完成。-并且我注意到在插入之前它正在执行一些select语句,我认为这是hibernate的脏检查以查看是否需要更新或插入。
有没有办法禁用它并提高hibernate插入速度?
一直在研究刷新,但不确定如何在一次保存整个列表时进行刷新?
我有三个实体列表,想要保存到数据库中。
总共大约有1000个实体需要持久化。
entityRepo.save(EntityList);
然而,这需要4-5分钟才能完成。-并且我注意到在插入之前它正在执行一些select语句,我认为这是hibernate的脏检查以查看是否需要更新或插入。
有没有办法禁用它并提高hibernate插入速度?
一直在研究刷新,但不确定如何在一次保存整个列表时进行刷新?
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
当你说脏检查会导致从数据库中读取时,你是正确的。如果你使用标准的Hibernate Session
来持久化你的实体,它们将像正常情况下一样由Hibernate管理。
如果你希望避免这种情况,最简单的方法可能是打开一个StatelessSession
并使用org.hibernate.StatelessSession.insert
。这不使用一级缓存,因此不需要对实体进行脏检查。
你可以通过调用SessionFactory#withStatelessOptions
来获取StatelessSessionBuilder
的实例来实现这一点。然后你可以调用org.hibernate.StatelessSessionBuilder.openStatelessSession
。
entity manager
。每次持久化一个对象时,Hibernate都会在第一级缓存中对所有实体进行脏检查,如果只有1个实体,则不会出现明显的问题,但是当有1000个实体时,它会非常快地进行检查。将其限制为50并在其中进行刷新/清除可以帮助解决这个问题。 - M. Deinum