Mybatis的一級緩存和二級緩存的理解和區(qū)別

一級緩存基于sqlSession默認開啟,在操作數(shù)據(jù)庫時需要構造SqlSession對象,在對象中有一個HashMap用于存儲緩存數(shù)據(jù)。不同的SqlSession之間的緩存數(shù)據(jù)區(qū)域是互相不影響的。

一級緩存的作用域是SqlSession范圍的,當在同一個sqlSession中執(zhí)行兩次相同的sql語句時,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內存),

第二次查詢時會從緩存中獲取數(shù)據(jù),不再去底層數(shù)據(jù)庫查詢,從而提高查詢效率。

需要注意的是,如果SqlSession執(zhí)行了DML操作(增刪改),并且提交到數(shù)據(jù)庫,MyBatis則會清空SqlSession中的一級緩存,這樣做的目的是為了保證緩存中存儲的是最新的信息,避免出現(xiàn)臟讀現(xiàn)象。

當一個SqlSession結束后該SqlSession中的一級緩存也就不存在了。

關閉一級緩存后,再次訪問,需要再次獲取一級緩存,然后才能查找數(shù)據(jù),否則會拋出異常。

二級緩存是mapper級別的緩存。使用二級緩存時,多個SqlSession使用同一個Mapper的sql語句去操作數(shù)據(jù)庫,得到的數(shù)據(jù)會存在二級緩存區(qū)域,它同樣是使用HashMap進行數(shù)據(jù)存儲。相比一級緩存SqlSession,二級緩存的范圍更大,多個Sqlsession可以共用二級緩存,二級緩存是跨SqlSession的。

二級緩存的作用域是mapper的同一個namespace。不同的sqlSession兩次執(zhí)行相同的namespace下的sql語句,且向sql中傳遞的參數(shù)也相同,即最終執(zhí)行相同的sql語句,則第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存,第二次查詢會從緩存中獲取數(shù)據(jù),不再去底層數(shù)據(jù)庫查詢,從而提高效率。

在MyBatis配置文件(mybatis-config.xml)中開啟二級緩存(詳細過程自己百度搜索開啟)

//value屬性默認為false

在**Mapper.xml中開啟當前mapper的namespace下的二級緩存

代表創(chuàng)建了一個LRU緩存,并每隔60秒刷新,最大存儲512個對象,而且返回的對象被認為是只讀的。

evicition收回策略,默認是LRU

(1)LRU最近最少使用策略,一處做長時間不被使用的對象。

(2)FIFO先進先出策略,按對象進入緩存的順序來移除它們。

(3)SOFT軟引用策略,移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。

(4)WEAK弱引用策略,更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象

---------------------

作者:llziseweiqiu

來源:CSDN

原文:https://blog.csdn.net/llziseweiqiu/article/details/79413130

版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容