1.一級緩存|二級緩存
- 一級緩存:
- 是指當使用SqlSession從數據庫中取數據時,Executor會在優先查找本地緩存中的數據,如果命中緩存,則直接返回本地緩衝區中的數據,否則會從數據庫中進行查找,查找結果緩存到本地的同時,發送給SqlSession。
- 當第二次查詢SQL語句相同時,會直接從本地緩存中拿取數據。session級別的一級緩存是靠PerpetualCache(內部原理HashMap<K, V>)實現的。
- 二級緩存:
- 二級緩存利用設計模式中的裝飾者模式得到一個CachingExecutor,CachingExecutor是Executor的實現類。其拿取數據流程和一級緩存類似。
- 不同的是二級緩存是應用級別的緩存,如果緩存數據較多的話,它可以將緩存內容存放至第三方數據庫中,如MemCached、Redis等。
2.一級緩存性能分析
- MyBatis對會話(Session)級別的一級緩存設計的比較簡單,就簡單地使用了HashMap來維護,並沒有對HashMap的容量和大小進行限制。
- 一級緩存是一個粗粒度的緩存,沒有更新緩存和緩存過期的概念。
3.MyBatis緩存級別
- MyBatis一級緩存有兩種級別:SESSION級別、STATEMENT級別
- MyBatis二級緩存級別是mapper級別的緩存,不同的mapper通常情況下有不同的namespace,也就都對應一個二級緩存。不同的mapper之間不會互相影響。需要注意的是,如果緩存的內容是查詢數據庫的結果,則當進行下一次增刪改操作時,緩存會被刷新,從而保證數據的一致性。
4.一級緩存的使用
- 開啓一級緩存
- SESSION級別:
<settings>
<setting name="localCacheScope" value="SESSION"/>
</settings>
- STATEMENT級別:
<settings>
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
<select id="selectAll" resultMap="BaseResult" useCache="true">
select * from tb_user
</select>
<!--
useCache - 使用緩存
flushCache - 執行完是否清除緩存
-->
- 執行後打印的日誌結果
5.二級緩存的使用
- 設置cacheEnabled,開啓二級緩存
<settings>
<!--配置一級緩存(默認開啓),共有兩個選項,SESSION或者STATEMENT,默認是SESSION級別,
即在一個MyBatis會話中執行的所有語句,都會共享這一個緩存。一種是STATEMENT級別,
可以理解爲緩存只對當前執行的這一個Statement有效。-->
<setting name="localCacheScope" value="SESSION"/>
<!-- 指定所用日誌的具體實現,未指定時將自動查找 [STDOUT_LOGGING]-MyBatis日誌 -->
<setting name="logImpl" value="LOG4J"/>
<!--開啓二級緩存-->
<setting name="cacheEnabled" value="true"/>
</settings>
- mapper中開啓默認緩存,只需寫上cache標籤即可。
<mapper>
<!--配置默認緩存-->
<cache></cache>
</mapper>
- 查看結果