Mybatis詳細對比一級緩存與二級緩存
基本要點
1、緩存
什么是緩存?
存在內(nèi)存中的臨時數(shù)據(jù),我們可以把用戶經(jīng)常查詢的數(shù)據(jù)存放到緩存中,當(dāng)用戶重復(fù)查詢時,我們可以直接從緩存中查詢,提高查詢效率,可以解決高并發(fā)系統(tǒng)的性能問題
為什么使用緩存?
減少和數(shù)據(jù)庫交互次數(shù),減輕數(shù)據(jù)庫的壓力,提高系統(tǒng)效率
什么樣的數(shù)據(jù)能使用緩存?
經(jīng)常查詢且不經(jīng)常改變的數(shù)據(jù)
2、一級緩存(默認開啟,無法關(guān)閉)
1)一級緩存的有效區(qū)間是sqlSession從創(chuàng)建到關(guān)閉的過程
假設(shè)我們重復(fù)執(zhí)行同一條查詢語句,如下圖所示
我們可以看出,程序只會連接數(shù)據(jù)庫查詢一次,后面的查詢結(jié)果都從緩存中取出

2)一級緩存失效的幾種情況
- 查詢不同的東西(前后2次的查詢不一樣,會刷新緩存)
- 執(zhí)行insert、update 和 delete 語句后會刷新緩存(增刪改操作可能會改變原來的數(shù)據(jù),所以必定會刷新緩存)
- 查詢不同的Mapper.xml
- 手動清除緩存,兩次查詢中間調(diào)用了sqlSession.clearCache()方法
3、二級緩存
1)定義
二級緩存是基于namespace級別的緩存,可以理解為單個Mapper級別的緩存
建議將SQL映射文件涉及到的實體類序列化,即實現(xiàn)Serializable接口,防止出現(xiàn)報錯
2)工作機制
- 所有的查詢數(shù)據(jù)都會先放在一級緩存中,當(dāng)會話commit或者sqlSession關(guān)閉時,系統(tǒng)會把一級緩存中的數(shù)據(jù)傳遞到二級緩存中
- 當(dāng)xml文件再次被調(diào)用且執(zhí)行相同的查詢操作時,直接從Mapper的緩存中查
- 不同的mapper查出的數(shù)據(jù)會放在自己對應(yīng)的緩存中
3)開啟步驟:
首先去mybatis-config.xml中開啟全局緩存
<settings>
<setting name="cachaEnable" value="value"/>
</setting>
在SQL映射文件文件中啟用全局的二級緩存
如下,我們創(chuàng)建了一個清除策略為 FIFO 的緩存,每隔 60 秒刷新
最多可以存儲結(jié)果對象或列表的 512 個引用,返回的對象被認為是只讀的
如果不需要參數(shù),直接使用<cache/>即可
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
4)緩存的幾種清除策略(主要了解以下2種)
- LRU – 最近最少使用:移除最長時間不被使用的對象。
- FIFO – 先進先出:按對象進入緩存的順序來移除它們。
- SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對象。
- WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對象
4、緩存查詢原理
我們的查詢請求會先去二級緩存中查看有沒有數(shù)據(jù)
如果沒有,就會去一級緩存中查有沒有
如果都沒有,再連接數(shù)據(jù)庫查詢
到此這篇關(guān)于Mybatis詳細對比一級緩存與二級緩存的文章就介紹到這了,更多相關(guān)Mybatis緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA教程創(chuàng)建SpringBoot前后端分離項目示例圖解
在使用spring、mybatis等框架時,配置文件很復(fù)雜,有時復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問題就都不是問題2021-10-10
Java中Date與String相互轉(zhuǎn)換的方法
這篇文章主要為大家詳細介紹了Java中Date與String相互轉(zhuǎn)換方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解
這篇文章主要介紹了 Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java數(shù)據(jù)結(jié)構(gòu)之棧的基本定義與實現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之棧的基本定義與實現(xiàn)方法,簡單描述了數(shù)據(jù)結(jié)構(gòu)中棧的功能、原理,并結(jié)合java實例形式分析了棧的基本定義與使用方法,需要的朋友可以參考下2017-10-10

