MyBatis
- 緩存
- 一級緩存
- 二級緩存
- 注
緩存
緩存,是數據交換的緩沖區(臨時保存數據的地方)。即將數據(數據一般為頻繁查詢且不易改變)保存在計算機內存中,下次讀取數據時直接從內存中獲取,以避免頻繁的訪問數據庫或磁盤文件,從而提高程序性能。
MyBatis 緩存,是 MyBatis 提供的一種優化機制,用于提高查詢效率和減少與數據庫的交互次數。在 MyBatis 緩存中,分為一級緩存和二級緩存。
一級緩存
一級緩存,是 SqlSession 級別的緩存。即在同一個 SqlSession 中,查詢結果會被緩存,以供后續的查詢直接使用。在 MyBatis 緩存中,只默認開啟一級緩存,而二級緩存需要手動配置開啟。另外,一級緩存之間是互相獨立的緩存空間,不能通信。
簡單示例:
1.使用同一個 SqlSession 中,第一次獲取查詢結果后再次進行相同的查詢,只執行一次 SQL 語句
查看日志,結果如圖:
2.使用同一個 SqlSession 中,第一次獲取查詢結果后再次進行不同的查詢,執行了兩次 SQL 語句(緩存中沒有找到對應的結果,所以執行 SQL 語句從數據庫中查找數據。當然,找到后也會放入緩存中)
查看日志,結果如圖:
同一個 SqlSession 下也執行了兩次 SQL 語句的其他情況:
(1)使用同一個 SqlSession 中,第一次獲取查詢結果后再次進行相同的查詢,但兩次查詢之間進行清空緩存(sqlSession.clearCache();)
(2)使用同一個 SqlSession 中,第一次獲取查詢結果后再次進行相同的查詢,但兩次查詢之間進行增改刪操作(緩存會刷新)
3.使用不同的 SqlSession 進行相同的兩次查詢,執行了兩次 SQL 語句
查看日志,結果如圖:
二級緩存
二級緩存(全局緩存),是 mapper 級別的緩存。即可以跨越多個 SqlSession ,允許在不同的 SqlSession 之間共享查詢結果,但需要在 mapper 文件中進行配置。在開啟二級緩存情況下,一級緩存的數據會在會話提交或關閉前轉存到二級緩存中。
簡單示例:
首先,手動配置開啟二級緩存。這需要在全局配置文件 mybatis.xml 中的 settings 標簽內添加開啟配置
<!-- 開啟二級緩存 -->
<setting name="cacheEnabled" value="true"/>
接著,映射文件中需要添加 < cache /> 標簽
<!-- 開啟二級緩存 -->
<cache />
然后,實體類必須實現序列化接口(implements Serializable)
最后,測試結果。使用不同的 SqlSession 進行相同的兩次查詢(需要 sqlSession1 關閉),執行了一次 SQL 語句
查看日志,結果如圖:
注
開啟二級緩存需要在 MyBatis 全局配置文件中配置 cacheEnabled 值為 true 。同時在映射文件中添加 < cache /> 標簽。另外,在 select 標簽的 useCache 屬性中,默認值為 true ,開啟二級緩存后,二級緩存生效;若設置為 false ,即使開啟二級緩存后也會在該 select 標簽中失效。而在 select 標簽的 flushCache 屬性中,默認值為 false ,使用所有緩存;若設置為 true ,則禁用所有緩存。但是,在增刪改標簽的 flushCache 屬性中,默認值為 true ,執行增刪改操作后刷新所有緩存。