我們,我們需要一個Hibernate會話,我知道加載的所有實體的唯一途徑過程中加載實體的整個表的所有實體是通過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緩存也不能做太多的事情來幫助您。 – Affe 2010-08-31 23:31:49
它是一個靜態表(每24小時至少靜態),更多的是,在給定的transacation中該方法被稱爲100次,我們可以輕鬆地在該DAO中「緩存」該事務的方法,但我很好奇,如果我正在重新創建已經完成的緩存,如果我以不同的方式加載表。 – Dougnukem 2010-09-01 18:04:06