gpt4 book ai didi

java - 如何防止 Hibernate 刷新列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:04 26 4
gpt4 key购买 nike

我有一个简单的 Hibernate 查询,例如:

from MyEntity where name = ?

没什么特别的,但它在一个相当大的事务中被调用了很多次(持续一秒钟,可能加载几十个或数百个实体)。 Profiler 显示大量时间花费在:

org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1240)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)

换句话说 - 在运行实际查询之前刷新更改。

我能否以某种方式完全阻止 Hibernate 执行此刷新操作?

如果没有,我该怎么做才能让它更快?

最佳答案

默认情况下,hibernate 在 session 期间发出查询之前会刷新 (FlushMode.AUTO),并且会占用大量 CPU 时间。如果您有一个 session ,其中许多查询和更新交替运行,那将特别痛苦。

如果查询可能会选择您在当前 session 期间插入/更新/删除的数据,那么您需要这些刷新。这可能也是这种情况,即使您没有修改当前事务中的任何内容而是使用事务隔离级别(如未提交读)也是如此。

假设您不想要未提交的读取等,我知道有两种解决方法:

  1. 在进行任何修改之前选择您在 session 期间需要的所有内容(即重新排序,以便在进行任何修改之前发出所有查询)。
  2. 如果您确定要选择在此 session 中未修改的数据,那么您可以将刷新模式明确设置为不会触发刷新的内容,如下所示:

    Query query = session.getNamedQuery(SOME_QUERY_NAME);
    query.setFlushMode(FlushMode.COMMIT);

关于java - 如何防止 Hibernate 刷新列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com