第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對象身份很重要的 Hibernate/JPA 的持久性

對象身份很重要的 Hibernate/JPA 的持久性

GCT1015 2022-06-23 17:57:06
我使用 Hibernate/JPA 作為持久性后端,本質(zhì)上歸結(jié)為一個用 Java 編寫的游戲的 mod。在這種情況下,在主線程上盡可能少地查詢數(shù)據(jù)庫對我來說非常重要。盡管可能,但異步執(zhí)行此操作是不切實際的,因為我必須從其他線程調(diào)用游戲?qū)ο蟮姆椒?,而這通常不起作用。這意味著我必須使用緩存對象在內(nèi)存中做盡可能多的事情,以最大限度地提高性能(因為使用內(nèi)存比等待查詢從數(shù)據(jù)庫返回結(jié)果要快)。假設(shè)我有如下定義的實體:@Entityclass Town {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name = "id", updatable = false, nullable = false)    private Long id;    @OneToMany(mappedBy = "town", fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this    private Set<Resident> residents;    // ... other fields and associated getters/setters}@Entityclass Resident {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name = "id", updatable = false, nullable = false)    private Long id;    @ManyToOne(fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this    @JoinColumn(name = "town_id")    private Town town;    // ... otehr fields and associated getters/setters}我的問題如下:如果我要使用 Hibernate 檢索所有 Resident 實體,并將它們存儲在內(nèi)存中(例如,使用 HashMap ),然后如果我要繼續(xù)使用 Hibernate 檢索所有 Town 實體并以相同的方式緩存它們,將調(diào)用Town#getResidents()返回引用內(nèi)存中的某些對象與駐留緩存中的對象相同嗎?本質(zhì)上,Hibernate 是否重用之前在查詢中返回的仍然有效的對象來填充新創(chuàng)建的集合?我也不反對對我的一般方法或關(guān)于如何改進它的建議的任何批評。先感謝您!:)
查看完整描述

3 回答

?
qq_遁去的一_1

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 {

...


查看完整回答
反對 回復(fù) 2022-06-23
?
波斯汪

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 之類的重量級框架是不是大材小用?


查看完整回答
反對 回復(fù) 2022-06-23
?
慕慕森

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)。無論如何,無論您如何決定。我個人不會使用休眠二級緩存:)


查看完整回答
反對 回復(fù) 2022-06-23
  • 3 回答
  • 0 關(guān)注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號