【问题标题】:Spring - Hibernate improve transaction performance with FlushModeSpring - Hibernate 使用 FlushMode 提高事务性能
【发布时间】:2014-02-19 15:23:30
【问题描述】:

我正在尝试提高异步事务方法的性能。

在这个任务中,我必须从一个表中读取近 7500 条记录,对其进行详细说明,然后在另一个表中插入/更新相应的行。

我正在使用带有休眠功能的 spring data jpa。

为了获得ScrollableResults,我将EntityManager 注入到我的服务中。

这是我如何获得我的ScrollableResult 对象:

Session session = (Session) em.unwrap(Session.class);
        ScrollableResults res = session.createQuery("from SourceTable s")
                .setCacheMode(CacheMode.IGNORE)
                .scroll(ScrollMode.FORWARD_ONLY);


while (res.next()){
.... // em.flush() called every 40 cycles
}

循环显示结果大约需要 60 秒。

这里是瓶颈。如果在我的循环中我执行一个简单的查询:

query = em.createQuery("from DestTable d where d.item.id = :id", DestTable.class);

 while (res.next()){
     query.setParameter("id", myId).getSingleResult();     
 }

执行时间变慢了 x10.. 大约需要 600 秒。

我尝试修改我的SessionEntityManager 的参数:session.setFlushMode(FlushModeType.COMMIT); em.setFlushMode(FlushModeType.COMMIT);

它提高了性能并消除了手动 flush() 方法,工作在 40 秒内完成!!!

所以我的问题是:

  • sessionenityManager 上调用setFlushMode 有什么区别?
  • 为什么setFlushMode(FlushModeType.COMMIT); 以这种方式提高性能,而我只能通过手动刷新 entityManager 来获得相同的性能?

【问题讨论】:

    标签: java spring hibernate entitymanager spring-data-jpa


    【解决方案1】:

    问题是默认刷新模式是FlushModeType.AUTO。在自动刷新模式下,Hibernate 将在每次查询之前刷新(仅查询,不查找操作)。这意味着在上面的示例中,默认情况下,每次调用 getSingleResult() 时,Hibernate 都会刷新。这样做的原因是因为您所做的更改可能会影响查询结果,因此 Hibernate 希望您的查询尽可能准确并首先刷新。

    您在第一个示例中看不到性能下降,因为您只发出一个查询并滚动浏览它。我找到的最佳解决方案是您提到的将刷新模式设置为COMMIT 的解决方案。在SessionEntityManager 上调用setFlushMode 应该没有区别。

    【讨论】:

    • 想到的一个可能的区别是,在会话中使用它只会覆盖当前事务的刷新属性,而在 entityManager 上设置属性是为所有人设置的。可以吗?
    • 不,EntityManager 和 Session 都与第一级上下文相关联。它们具有相同的生命周期。如果您能够在 SessionFactory 或 EntityManagerFactory 上设置刷新模式,那么可能就是这种情况,但据我所知,没有办法做到这一点。
    • 休眠刷新的问题在于它触发了actionqueue的构建然后处理它。在刷新时,您拥有的托管实体越多,问题就越明显。 Hibernate 会检查每一个!更改的实例。因此,如果像您的情况一样,您知道您的代码对查询列表没有影响,那么最终刷新(提交时)的解决方案可以解决该问题。另一种选择应该是在您的目标查询之前在实体管理器上调用 clear 以保持刷新循环尽可能小。副作用是较小的内存占用。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2012-08-10
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多