日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jpa一级缓存和二级缓存_了解一级JPA缓存

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa一级缓存和二级缓存_了解一级JPA缓存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jpa一級緩存和二級緩存

我敢打賭,每個Java開發人員至少都聽說過L1(又名EntityManager或Session)緩存。 但是您的理解水平足夠好嗎? 如果不確定,請考慮閱讀這篇文章。

首先,我們需要知道持久性上下文是什么。 根據EntityManager JavaDoc,我們知道:

“持久性上下文是一組實體實例,其中對于任何持久性實體標識,都有一個唯一的實體實例。 在持久性上下文中,管理實體實例及其生命周期。”

實際上,第一級緩存與持久性上下文相同。 這意味著諸如persist() , merge() , remove()之類的操作只會更改上下文中的內部集合,而不會同步到基礎數據庫。 最重要的是,當您調用clear()方法時會發生什么。 清除L1緩存。 但是我們知道L1 ==持久性上下文。 這是否意味著清除L1會刪除所有實體? 實際上是的-所有實體都將被刪除,并且永遠不會同步到數據庫。 這不是秘密,它在文檔中指出–” 對實體(…)進行的未經修改的更改將不會同步到數據庫。 ”但是誰在乎文檔呢? :)

那么它在實踐中看起來如何? 看下面的代碼:

em.persist(myEntity); // saves entity to the context em.flush(); // triggers insert into database em.clear(); // removes entity from the context == entity is no longer managed

如果省略flush(),則實體將不會訪問數據庫。 它僅存在于您的代碼中,并且在離開創建該對象的方法之后將丟失。 讓我們看下一個示例:

myEntity.setName("old name"); em.persist(myEntity); em.flush(); em.clear(); myEntity.setName("new name"); em.flush();

完成此代碼后, name屬性的值是什么? 當然仍然是“舊名稱”,因為在調用setName()的那一刻,該實體不再受管理,并且必須與持久性上下文合并(通過調用em.merge(myEntity)方法)才能成為主題骯臟的檢查 。

但是我沒有在代碼中調用flush()方法,所以一切正常! 但是,您是否調用clear() ? 我也這么想。 默認的刷新行為是什么? 默認情況下,JPA刷新提交以及每次查詢執行時所做的更改( FlushModeType.AUTO) 。 如果將其更改為COMMIT(使用em.setFlushMode(FlushModeType.COMMIT)方法),則僅在提交時才會進行刷新(顧名思義)。

在處理批處理操作時,深入了解L1行為尤其重要。 為什么? 如果您希望這種操作有效,那么我們就必須不時手動刷新更改(假設每100次操作)。 您知道嗎,flush()不會清除持久性上下文嗎? 那又如何呢? 刷新并不便宜,因為它必須處理上下文中的所有實體,以查看是否有任何要與數據庫同步的對象。 如果您不會在flush()之后立即手動清除上下文,則每個下一個操作將花費越來越長的時間。 坦白地說,這一次呈指數增長,這似乎足以記住有關提到的技術。

如果您有興趣深入了解持久性上下文,請隨時克隆并使用此存儲庫 ,其中包含所有描述的案例和示例。

翻譯自: https://www.javacodegeeks.com/2017/04/understanding-first-level-jpa-cache.html

jpa一級緩存和二級緩存

總結

以上是生活随笔為你收集整理的jpa一级缓存和二级缓存_了解一级JPA缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。