關于spring data jpa一級緩存的問題
spring data jpa一級緩存
jpa更新數(shù)據(jù),數(shù)據(jù)庫更新了,但是查詢出來的還是更新前的問題,這是因為jpa的一級緩存,查詢默認是從緩存中查詢的,而不是從DB查詢。
解決辦法
repository
update方法上加入@Modifying(clearAutomatically = true)即可,它更新完數(shù)據(jù)庫后會主動清理一級緩存,但我用了好像沒什么效果,可能使用方法不對,建議使用下面這個
entityManager對象
通過 em.clear(); 在每次查詢前清除 JPA 緩存
spring data jpa的那些坑
springdatajpa是持久化框架,底層是hibernate實現(xiàn)的,基本原理與hibernate一致。
hibernate緩存機制
Hibernate的一級緩存就是指Session緩存,此Session非http的session會話技術(shù),可以理解為JDBC的Connection,連接會話,Session緩存就是一塊內(nèi)存空間,用來存放相互管理的java對象,在使用Hibernate查詢對象的時候,首先使用對象的OID(ObjectID)
在Hibernate的一級緩存空間進行查找,如果通過OID匹配到了對象,就直接從一級緩存中取出使用,如果沒有找到匹配該OID值的對象,這才會進行查詢數(shù)據(jù)庫。
當從數(shù)據(jù)庫中查詢數(shù)據(jù)的時候,該數(shù)據(jù)就會被放入到Session緩存中,目的就是為了減少數(shù)據(jù)庫的訪問次數(shù),從而提高性能
特點
- 當應用程序調(diào)用Session接口的 save(), update(), saveOrUpdate() 時候,如果緩存中沒 有相應的對象,Hb就會自動的把查詢信息加入到緩存。
- 當應用程序調(diào)用Session接口的 load(), get(), list() 等查詢方法的時候,會進行判斷緩存中是否有數(shù)據(jù),同摘要。
- 當應用程序調(diào)用Session接口的 close() Session緩存會被清空
案例
public void demo1 (){ Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); User user1 = session.get(User.class, "1"); System.out.println(user1); System.out.println("-------------"); User user2 = session.get(User.class, "1"); System.out.println(user2); System.out.println(user1 == user2); transaction.commit(); session.close(); }
我們發(fā)現(xiàn)第一次執(zhí)行Session的get()方法的時候,由于一級緩存中沒有數(shù)據(jù),所以會向數(shù)據(jù)庫發(fā)送一條sql語句進行查詢,第二次調(diào)用get()的時候,則不會發(fā)送sql語句,而是從一級緩存中取的,所以user和user2的內(nèi)存地址相等
一級緩存的快照區(qū)
Hibernate向一級緩存放入數(shù)據(jù)的時候,同時復制一份放到Hibernate快照中,當使用commot()提交事務的時候,同時會清理Session的一級緩存,這是會用OID判斷一級緩存中的對象和快照中的對象是否一致,如果一致則執(zhí)行update 語句,將緩存中的內(nèi)容同步到數(shù)據(jù)庫,并且更新快照,這也就實現(xiàn)了不使用 update 語句就可以自動更新數(shù)據(jù)庫,Hibernate快照的作用也就是為了保持緩存中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)的一致性。
線上坑案例
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java如何解決發(fā)送Post請求報Stream?closed問題
這篇文章主要介紹了Java如何解決發(fā)送Post請求報Stream?closed問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringCloud之監(jiān)控數(shù)據(jù)聚合Turbine的實現(xiàn)
這篇文章主要介紹了SpringCloud之監(jiān)控數(shù)據(jù)聚合Turbine的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08springboot利用AOP完成日志統(tǒng)計的詳細步驟
項目用到了過濾器,可能有的人會不理解,之所以用過濾器是因為想要在日志記錄post請求的json數(shù)據(jù)。本文重點給大家介紹springboot利用AOP完成日志統(tǒng)計的詳細步驟,感興趣的朋友跟隨小編一起看看吧2021-12-12java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法
這篇文章主要介紹了java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法的相關資料,需要的朋友可以參考下2016-11-11SpringBoot如何使用applicationContext.xml配置文件
這篇文章主要介紹了SpringBoot使用applicationContext.xml配置文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06