【发布时间】:2013-01-18 16:42:12
【问题描述】:
我有一个简单的 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 执行此刷新操作?
如果没有,我该怎么做才能让它更快?
【问题讨论】:
-
您是否使用不同的绑定参数运行查询?查询返回一个结果还是多个?
-
nMoncho - 在此会话中每次都使用相同的参数,返回一个唯一的结果。是的,我确实使用可缓存查询。
-
可能是只读事务?也许将整个实体标记为只读(不记得如何制作)。同样,一旦您第一次获取它,您就会知道 ID。通过 PK 获取缓存在 L1 中,应该更智能。最后考虑更高级别的缓存,例如 Spring 中的
@Cacheable。最后但同样重要的是,尝试分离该实体,Hibernate 会忘记它。