mybatis的緩存機制:一級緩存和二級緩存的區別


(鑲嵌點:)Sqlsession(接口)的底層是hashmap存儲,線程不安全,sqlsessionTemplate是其實現類線程安全的

區別:一級緩存的作用域是一個sqlsession內;二級緩存作用域是針對mapper進行緩存.

一級緩存:

1、第一次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數據庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。

2、如果中間sqlSession去執行commit操作(執行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。

3、第二次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。

小結: 一級緩存時執行commit,close,增刪改等操作,就會清空當前的一級緩存; 當對SqlSession執行更新操作(update、delete、insert)后並執行commit時,不僅清空其自身的一級緩存(執行更新操作的效果),也清空二級緩存(執行commit()的效果)。
 
二級緩存:
 
不管是不是相同的session,只要mapper的namespace相同,可能共享緩存,要求:如果開啟了二級緩存,那么在關閉sqlsession后(close),才會把該sqlsession一級緩存中的數據添加到namespace的二級緩存中。
 
開啟了二級緩存后,還需要將要緩存的pojo實現Serializable接口,為了將緩存數據取出執行反序列化操作,因為二級緩存數據存儲介質多種多樣,不一定只存在內存中,有可能存在硬盤中
 

那么在同一個session下,執行同一個select語句時,Cache Hit Ratio [Mapper]: 0.0,二級緩存的命中率為0那?

答:這里要講解一下二級緩存的緩存什么時候存入了:只有當當前的session.close()時,該session的數據才會存入二級緩存.在同一session下時,肯定沒有執行.close()關閉session,自然也就沒有存入二級緩存.第二次執行卻沒有重新發送sql語句,是因為第二次調用的是一次緩存中的數據.

如果想讓二級緩存命中率不為0,需要先開啟一個session,執行一個sql語句,然后關閉該session,然后在創建一個新的session,執行相同的sql語句,這時,二級緩存才會命中

原文:https://blog.csdn.net/jinbaizhe/article/details/81158514(commit和close對二級緩存的影響)(很詳細)

原文:https://www.jianshu.com/p/2be932206c59(一級緩存和二級緩存的區別)

原文:https://blog.csdn.net/scarecrow_fly/article/details/71440400(sqlSession和sqlSessionfactory和sqlSessionfactorybuilder的生命周期)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM