mybatis_cache系列
建議按順序閱讀
前言
本文主要闡述mybatis一級緩存與二級緩存區別。
純理論簡述,將不會有代碼coding。建議閱讀上述兩文後再閱讀
大白話簡述什麼是一級緩存?
首先一級緩存我們要知道是mybatis爲我們默認開啓的。
在客戶端使用mybatis與數據庫交互時,mybatis會將查詢結果存到一級緩存中,待下次用同一個會話再執行相同查詢操作時候就直接從緩存中獲取數據返回,從而減輕數據庫的壓力,也給系統提高響應速度。
大白話簡述什麼是二級緩存?
還是一樣來說一下開啓狀態,二級緩存默認是沒有開啓的,要使用的話,需要我們手動配置。
同理,二級緩存也是在客戶端與數據庫交互時,mybatis會將查詢結果存到二級緩存中,待下次再次操作同一個xml文件執行相同的查詢操作時候就直接從緩存中獲取數據返回,從而減輕數據庫的壓力,也給系統提高響應速度。
緩存命中流程圖
一級緩存命中流程
二級緩存命中流程
通過上面兩幅圖可以看到如果二級緩存有數據的話,則是優先命中二級緩存,其次纔是命中一級緩存。
如果兩個緩存都沒有數據,最後纔去查詢數據庫
影響緩存命中規則的因素
一級緩存與二級緩存的命中規則完全一致,它們都是使用相同計算規則產生的cacheKey來作爲各自的緩存key值。
所以影響這個cacheKey的因素就是影響緩存的命中因素,所以他們兩者的命中規則因素是一致的。
找了一下生成cacheKey的mybatis源碼,簡單解釋一下,代碼如下:
從上至下紅框分別代表了cacheKey的組成部分
- statementId(xml文件的具體sql語句的標籤id)
- offset(mybatis分頁參數)
- limit(mybatis分頁參數)
- sql(執行的sql語句)
- value(執行sql語句接收的所有邏輯參數)
- environment(mybatis的sqlsessionFactory環境)
上述幾點就是合起來就組成了cacheKey,mybatis就是根據這個key從緩存中get、set
緩存生命週期
生命週期顧名思義就是緩存何時創建,緩存的作用域,緩存何時會銷燬,以及遇到什麼情況會銷燬
何時創建
一級緩存
在同一個sqlsession內,執行一條查詢sql,mybatis就會把數據立即存入一級緩存內,待下次繼續執行相同sql時則從緩存中獲取。
二級緩存
在同一個sqlsessionFatory內,執行一條查詢sql,mybatis就會把數據立即存入待存入二級緩存的HashMap中,當本次sqlsession執行close/commit時,源碼將調用二級緩存的實現執行commit函數,將待存入二級緩存的HashMap進行遍歷後將數據都存入二級緩存中。
大白話就是:查詢到的數據,除非執行了close/commit,否則不會將數據存入二級緩存。
作用範圍:sqlsessionFatory > sqlsessioon;一個sqlsessionFatory可以open多個sqlsession
作用範圍
緩存的作用範圍,也就是超出這個範圍即無法命中緩存
相同因素
同一個xml文件
一級緩存
- 同一個xml文件
- 同一個sqlsession
- 同一個事務
二級緩存
- 同一個xml文件
- 同一個sqlsessionFatory
可以看到二級緩存的作用域是大於一級緩存的
何時銷燬,以及什麼情況會銷燬
相同因素
- session回滾(二級緩存需特別說明)
- 執行update/insert/delete語句
一級緩存
- session關閉
- session提交
- session回滾
- 執行update/insert/delete語句
- 手動銷燬
二級緩存
- session回滾
- 執行update/insert/delete語句
session回滾
一級緩存
將銷燬一級緩存裏的所有數據
二級緩存
將銷燬待存入二級緩存的HashMap的所有數據,這些數據實際還不算是二級緩存的數據。