【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的生命週期)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章