(鑲嵌點:)Sqlsession(接口)的底層是hashmap存儲,線程不安全,sqlsessionTemplate是其實現類線程安全的
區別:一級緩存的作用域是一個sqlsession內;二級緩存作用域是針對mapper進行緩存.
一級緩存:
1、第一次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數據庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。
2、如果中間sqlSession去執行commit操作(執行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
3、第二次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
那么在同一個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的生命周期)