我有一个简单的 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 期间插入/更新/删除的数据,那么您需要这些刷新。这可能也是这种情况,即使您没有修改当前事务中的任何内容而是使用事务隔离级别(如未提交读)也是如此。
假设您不想要未提交的读取等,我知道有两种解决方法:
- 在进行任何修改之前选择您在 session 期间需要的所有内容(即重新排序,以便在进行任何修改之前发出所有查询)。
如果您确定要选择在此 session 中未修改的数据,那么您可以将刷新模式明确设置为不会触发刷新的内容,如下所示:
Query query = session.getNamedQuery(SOME_QUERY_NAME); query.setFlushMode(FlushMode.COMMIT);
关于java - 如何防止 Hibernate 刷新列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403498/