日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Mybatis的一級緩存和二級緩存及其區別

作者:小趙在練琴 更新時間: 2022-09-26 編程語言

今天來講一下Mybatis的一級緩存, 二級緩存及其區別

目錄

一. 緩存是什么

二. 一級緩存

? ? ? ? 一級緩存是什么

? ? ? ? 一級緩存何時清空?

? ? ? ? 一級緩存的流程圖

三. 二級緩存

? ? ? ? 二級緩存是什么

????????二級緩存何時存入

????????二級緩存有過期時間,但沒有后臺線程進行檢測?

? ? ? ? 二級緩存的流程圖

注意事項


一. 緩存是什么

????????緩存其實就是存儲在內存中的臨時數據,這里的數據量會比較小,一般來說,服務器的內存也是有限的,不可能將所有的數據都放到服務器的內存里面,所以, 只會把關鍵數據放到緩存中,? 這樣的話訪問起來非常快, 而且方便(doge),當 Mybatis 調用 Dao 層查詢數據庫時,先查詢二級緩存,二級緩存中無對應數據,再去查詢一級緩存,一級緩存中也沒有,最后去數據庫查找。

二. 一級緩存

? ? ? ? 一級緩存是什么

?????????一級緩存作用域是sqlsession級別的,同一個sqlsession中執行相同的sql查詢(相同的sql和參數),第一次會去查詢數據庫并寫到緩存中,第二次從一級緩存中取。

? ? ? ? 一級緩存何時清空?

????????如果中間sqlSession去執行commit操作(執行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。一級緩存時執行commit,close,增刪改等操作,就會清空當前的一級緩存;當對SqlSession執行更新操作(update、delete、insert)后并執行commit時,不僅清空其自身的一級緩存(執行更新操作的效果),也清空二級緩存(執行commit()的效果)。

? ? ? ? 一級緩存的流程圖

三. 二級緩存

? ? ? ? 二級緩存是什么

????????二級緩存指的是Mybatis中SqlSessionFactory對象的緩存。由同一個SqlSessionFactory對象創建的SqlSession共享其緩存。

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

????????二級緩存何時存入

????????在關閉sqlsession后(close),才會把該sqlsession一級緩存中的數據添加到namespace的二級緩存中。

????????開啟了二級緩存后,還需要將要緩存的pojo實現Serializable接口,為了將緩存數據取出執行反序列化操作,因為二級緩存數據存儲介質多種多樣,不一定只存在內存中,有可能存在硬盤中。

????????二級緩存有過期時間,但沒有后臺線程進行檢測?

?????? ? ? ?
????????需要注意的是,并不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味著整個清空緩存cache,所以不需要后臺線程去定時檢測。

每當存取數據的時候,都有檢測一下cache的生命時間,默認是1小時,如果這個cache存活了一個小時,那么將整個清空一下。

?

? ? ? ? 二級緩存的流程圖

?

注意事項

  1. 映射語句文件中的所有 select 語句的結果將會被緩存。
  2. 映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。
  3. 緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
  4. 緩存不會定時進行刷新(也就是說,沒有刷新間隔)。
  5. 緩存會保存列表或對象(無論查詢方法返回哪種)的 1024 個引用。
  6. 緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。
    ?

原文鏈接:https://blog.csdn.net/annotation_PLZ/article/details/126923850

欄目分類
最近更新