當前位置:
首頁 > 知識 > mybatis 詳解——一級緩存、二級緩存

mybatis 詳解——一級緩存、二級緩存

mybatis 為我們提供了一級緩存和二級緩存,可以通過下圖來理解:

mybatis 詳解——一級緩存、二級緩存

①、一級緩存是SqlSession級別的緩存。在操作資料庫時需要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

②、二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

1、一級緩存

①、我們在一個 sqlSession 中,對 User 表根據id進行兩次查詢,查看他們發出sql語句的情況。

mybatis 詳解——一級緩存、二級緩存

查看控制台列印情況:

mybatis 詳解——一級緩存、二級緩存

②、 同樣是對user表進行兩次查詢,只不過兩次查詢之間進行了一次update操作。

mybatis 詳解——一級緩存、二級緩存

控制台列印情況:

mybatis 詳解——一級緩存、二級緩存

③、總結

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

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

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

mybatis 詳解——一級緩存、二級緩存

2、二級緩存

二級緩存的原理和一級緩存原理一樣,第一次查詢,會將數據放入緩存中,然後第二次查詢則會直接去緩存中取。但是一級緩存是基於 sqlSession 的,而 二級緩存是基於 mapper文件的namespace的,也就是說多個sqlSession可以共享一個mapper中的二級緩存區域,並且如果兩個mapper的namespace相同,即使是兩個mapper,那麼這兩個mapper中執行sql查詢到的數據也將存在相同的二級緩存區域中。

mybatis 詳解——一級緩存、二級緩存

那麼二級緩存是如何使用的呢?

①、開啟二級緩存

和一級緩存默認開啟不一樣,二級緩存需要我們手動開啟

首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代碼:

mybatis 詳解——一級緩存、二級緩存

我們可以看到 mapper.xml 文件中就這麼一個空標籤<cache/>,其實這裡可以配置<cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>,PerpetualCache這個類是mybatis默認實現緩存功能的類。我們不寫type就使用mybatis默認的緩存,也可以去實現 Cache 介面來自定義緩存。

mybatis 詳解——一級緩存、二級緩存

mybatis 詳解——一級緩存、二級緩存

我們可以看到 二級緩存 底層還是 HashMap 架構。

②、po 類實現Serializable序列化介面

mybatis 詳解——一級緩存、二級緩存

開啟了二級緩存後,還需要將要緩存的pojo實現Serializable介面,為了將緩存數據取出執行反序列化操作,因為二級緩存數據存儲介質多種多樣,不一定只存在內存中,有可能存在硬碟中,如果我們要再取這個緩存的話,就需要反序列化了。所以mybatis中的pojo都去實現Serializable介面。

③、測試

一、測試二級緩存和sqlSession 無關

mybatis 詳解——一級緩存、二級緩存

可以看出上面兩個不同的sqlSession,第一個關閉了,第二次查詢依然不發出sql查詢語句。

二、測試執行 commit() 操作,二級緩存數據清空

mybatis 詳解——一級緩存、二級緩存

查看控制台情況:

mybatis 詳解——一級緩存、二級緩存

④、useCache和flushCache

mybatis中還可以配置userCache和flushCache等配置項,userCache是用來設置是否禁用二級緩存的,在statement中設置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。

mybatis 詳解——一級緩存、二級緩存

這種情況是針對每次查詢都需要最新的數據sql,要設置成useCache=false,禁用二級緩存,直接從資料庫中獲取。

在mapper的同一個namespace中,如果有其它insert、update、delete操作數據後需要刷新緩存,如果不執行刷新緩存會出現臟讀。

設置statement配置中的flushCache=」true」 屬性,默認情況下為true,即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改資料庫表中的查詢數據會出現臟讀。

mybatis 詳解——一級緩存、二級緩存

一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免資料庫臟讀。所以我們不用設置,默認即可。

文章摘自博客園


更多精彩推薦

IT教育專業培訓:http://www.ujiuye.com/

IT職業在線教育:http://xue.ujiuye.com/

互聯網營銷集訓營:http://www.ujiuye.com/zt/zsjz/?wt.bd=lsh11tt

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

遍歷文件,把文件內容導入資料庫
css超簡單實現div頁面居中 適合做彈出框

TAG:IT優就業 |

您可能感興趣

redis緩存過期策略,監聽redis緩存
MyBatis中的緩存
windows緩存
Intel Ice Lake架構首次現身:一二級緩存增大
10nm工藝!Intel全新架構Ice Lake首次現身:一二級緩存增大
redis緩存和cookie實現Session共享
python的緩存庫:cacheout
Hitachi Vantara升級Skylaking伺服器加入Optane緩存和GPU
Flutter圖片緩存 Image.network源碼分析
Python + Memcached:在分散式應用程序中實現高效緩存
緩存架構SpringBoot集成Curator實現zookeeper分散式鎖
Python+Memcached:在分散式應用程序中實現高效緩存
HashCache:低內存緩存存儲系統
Python + Memcached: 在分散式應用程序中實現高效緩存
Bloom Filter如何解決緩存穿透
int 和 Integer 有什麼區別?談談 Integer 的值緩存範圍
PB級數據持久化緩存系統——lest
SpringBoot:SpringDataRedis緩存改造
TinyShop緩存文件獲取WebShell之0day
使用RedisTemplate(JDK序列化策略)緩存實體類