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

标签 java hibernate

我有一个简单的 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/

相关文章:

Java 1.5 枚举 : Why can't I use 'findBy' with 1. 5 个枚举?

不可序列化第三方类的Java序列化

java - 使用数据库设置应用程序 - tapestry-hibernate 失败

java - @Id 在插入实体 bean 时不会自动设置

sql - 如何使用 Hibernate SQL 查询更新单元格数据

spring - 无法转换为 org.hibernate.annotations.common.reflection.MetadataProviderInjector

java - 无法获取静态字段的值

javascript - 预期条件失败 : waiting for element to be clickable for element containing style ="display: none;"

java - 具有指定对象的实例引用变量(对象)是否立即在堆上创建?

java - 外键约束在多对多 Hibernate 关系上失败