【发布时间】:2011-04-06 12:50:37
【问题描述】:
我们需要在休眠会话期间加载整个实体表,而我知道加载所有实体的唯一方法是通过 HQL 查询:
public <T> List<T> getAllEntities(final Class<T> entityClass) {
if (null == entityClass)
throw new IllegalArgumentException("entityClass can't be null");
List<T> list = castResultList(createQuery(
"select e from " + entityClass.getSimpleName() + " e ").list());
return list;
}
我们使用 EHcache 进行二级缓存。
问题是这在给定的事务会话中被调用了 100 次,并且占用了总时间的相当一部分。有没有办法加载给定类型的所有实体(加载整个表)并且仍然受益于一级会话缓存或二级 ehcache。
我们被告知要远离查询缓存,因为相对于它们的收益而言,它们可能会降低性能。 * Hibernate Query Cache considered harmful
虽然我们现在正在进行性能分析,所以可能是时候尝试打开查询缓存了。
【问题讨论】:
-
为什么您的代码首先在同一个事务中重新加载整个表 100 次?如果是因为其他线程可能正在执行插入操作,那么即使您以某种晦涩难懂的方式重写代码来使用它们,L1 和 L2 缓存都无法为您提供太多帮助。
-
这是一个静态表(至少每 24 小时是静态的)更重要的是,该方法在给定的事务中被调用了 100 次,我们可以轻松地在 DAO 中为该事务“缓存”该方法,但我很好奇如果我以不同的方式加载表,我是否正在重新发明已经完成的缓存。
标签: java hibernate orm caching ehcache