2010-11-10 109 views
1

我有JPA具有特定子類型中表示的用戶對象。例如,考慮User,然後是子類Admin,以及另一個子類Power User。優化在第二級緩存休眠/ jpa大選擇

比方說,我有100K用戶。我已經使用Ehcache成功實現了二級緩存,以提高性能並驗證它正在工作。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

我知道它在您調用load方法時可以工作(即,您從緩存中加載對象而不是調用sql查詢)。我通過在休眠級別進行日誌記錄驗證了這一點,並驗證了它更快。

但是,我實際上想要選擇所有用戶的子集......例如,假設我想要計算有多少個超級用戶。

此外,我的用戶有一個關聯的ZipCode對象... ZipCode對象也是二級緩存...我想要做的是實際上能夠詢問像......有多少個超級用戶我在紐約州...

但是,我的問題是...我如何寫一個查詢來做到這一點,將達到二級緩存,而不是數據庫。請注意,我的第二級緩存被配置爲可讀/寫...因此,當新用戶被添加到系統中時,他們應該被自動添加到緩存中......還有......請注意,我已經簡要地調查了Query緩存,但是我不確定這適用於多次運行的查詢......我的問題更多的是......數據應該在二級緩存中,所以我必須做些什麼以便當我編寫我的查詢時數據庫不會被擊中。

歡呼聲, 布賴恩

回答

0

(...)的數據應該在二級緩存反正所以我有什麼做的,這樣,當我寫我的查詢數據庫沒有遭到襲擊。

如果您的查詢返回的實體緩存,看看Query#iterate()。這將觸發第一個查詢來檢索ID列表,然後對每個ID進行後續查詢......這將會觸及L2緩存。

+0

嗨帕斯卡,你似乎是休眠/ jpa大師:)謝謝你回答我的問題。不幸的是我使用JPA 1.0,所以我想知道是否有任何方法在javax.persistence.Query https://glassfish.dev.java.net/nonav/javaee5/api/index.html?javax/persistence/package -summary.html調用相同的東西?再次感謝。 Brian – Brian 2010-11-10 15:55:35

+0

@Brian事實上,我建議在這裏使用Hibernate的'Query',JPA沒有與我所建議的相同的東西。 – 2010-11-10 16:03:24

+0

感謝那個帕斯卡。出於興趣,是否還有其他替代方法,或者這是您唯一知道的方法?非常感謝你的幫助。 – Brian 2010-11-10 16:14:49