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缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache.camel_Apache
- 下一篇: kafka数据到flume_大数据摄取: