一級緩存基于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)文章,轉載請附上博文鏈接!