3 回答

TA貢獻(xiàn)1725條經(jīng)驗 獲得超8個贊
緩存是一個非常復(fù)雜的話題。您不必自己處理緩存。這就是休眠二級緩存的用途。
諸如 ORM(對象關(guān)系映射)框架之類的數(shù)據(jù)庫抽象層的優(yōu)點之一是它們能夠透明地緩存從底層存儲中檢索到的數(shù)據(jù)。這 有助于消除頻繁訪問數(shù)據(jù)的數(shù)據(jù)庫訪問成本。
您仍然必須將實體配置為可緩存以及休眠應(yīng)緩存的積極程度,但其余部分將由休眠處理
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Resident {
...

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
如果堆消耗不是問題,或者產(chǎn)生的實例不多,那么您的方法還不錯。我看到您已經(jīng)在使用FetchType.EAGER
,這是重要的部分。
我想說你甚至不需要檢索Resident
(s),你可以收集residents
Set<Resident>
each 的Town
。
一旦檢索到所有實例,我也會明確地顯示EntityManager#detach
它們。
是的,Hibernate 維護了多個級別的緩存。請參閱文檔。
如果我可能會問,您為什么使用 JPA?畢竟,更底層的方法,也許使用 MyBatis,不是更好的方法嗎?依賴 Hibernate 之類的重量級框架是不是大材小用?

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
我不同意關(guān)于緩存的公認(rèn)答案。我有另一個答案,我已經(jīng)詳細(xì)解釋了為什么我不喜歡使用 Redis 進行休眠二級緩存的休眠二級緩存 - 它會提高性能嗎?到目前為止,使用休眠二級緩存并不是一種常見的緩存策略。有幾個原因:
Hibernate 二級緩存效率很低。它使用默認(rèn)的 java 序列化,這非常慢并且非常缺乏內(nèi)存。
經(jīng)常使用休眠二級緩存需要保持關(guān)系的一致性。一個這樣的例子是當(dāng)您需要從集合中刪除一個元素時。如果您使用簡單的 pojoes,保持一致性通常不是什么大問題,但是當(dāng)您開始將持久性邏輯與緩存混合時,它開始變得非常煩人。
如果您決定從純二級緩存轉(zhuǎn)到帶有休眠的分布式緩存。復(fù)雜性會以一種不好的方式飆升,然后您將很難了解為什么休眠緩存效率低下。
我會與接受的答案完全相反,建議您將緩存與持久性分離為簡單的 Pojos。并通過這些 Pojo 管理緩存。
現(xiàn)在關(guān)于你的模型。我不知道您所涵蓋的功能,但我強烈懷疑任何人都無法獲取擁有所有居民的城鎮(zhèn)。我建議您刪除從城鎮(zhèn)到居民的 OneToMant 關(guān)系?;诖耍铱吹揭韵聢鼍埃?/p>
以居民為中心的數(shù)據(jù)處理,您可能會重復(fù)點擊居民。您可以決定緩存完整的居民和城鎮(zhèn),或者如果您沒有找到同一個居民,您可以決定只緩存城鎮(zhèn)。
將城鎮(zhèn)和居民緩存在同一區(qū)域,您的處理以居民為中心。您可以選擇在城鎮(zhèn)和居民的同一個鍵下緩存在一起,您會犧牲一些內(nèi)存是的。但是,您將一口氣對記憶和城鎮(zhèn)產(chǎn)生直接影響。
Resident 和 Town 的兩個緩存區(qū)域,但是您需要為 1 resident 執(zhí)行兩次查找。在內(nèi)存方面效率更高,在性能方面并非如此。
緩存只鎮(zhèn)。無論如何,無論您如何決定。我個人不會使用休眠二級緩存:)
添加回答
舉報