后端:MyBatis緩存知識介紹,你學到了嗎?
今天給大家分享一下MyBatis緩存知識介紹,希望對大家日常的開發當中能有所幫助!
一、MyBatis一級緩存
1、一級緩存介紹
當我們的程序MyBatis開啟一次和數據庫的會話,MyBatis會自動創建出一個SqlSession對象表示這一次數據庫的會話。在同一個數據庫會話當中,MyBatis提供了一級緩存的方案優化這部分場景,針對相同的SQL查詢語句,會優先命中一級緩存,避免再次對數據庫進行查詢,從而提高查詢性能、減輕數據庫的壓力。
開啟一級緩存
MyBatis的配置文件加上如下:
- <setting name="localCacheScope" value="SESSION"/>
注意:localCacheScope 值有兩個 SESSION(開啟一級緩存)/Statement(關閉一級緩存)
一級緩存失效場景
- SqlSeesion實例不同
- SqlSeesion實例相同,查詢條件不同
- SqlSeesion對象相同,查詢條件也相同,但兩次查詢之間執行了增刪改操作
- SqlSeesion對象相同,兩次查詢條件相同,中間無其它增刪改操作,但使用了clearCache()方法
總結
- MyBatis一級緩存的生命周期和SqlSession一致。默認是開啟狀態。
- MyBatis一級緩存采用HashMap性能較差
- 分布式環境下對數據庫操作容易引起臟數據,不推薦開啟MyBatis一級緩存
二、MyBatis二級緩存
1、二級緩存介紹
MyBatis一級緩存生命周期是一個SqlSession內部,如果多個 SqlSession 需要共享緩存,則需要開啟二級緩存,開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor,進入一級緩存的查詢流程前,先在CachingExecutor 進行二級緩存的查詢。
2、為什么有二級緩存?
- 為了避免和數據庫頻繁交互。這是設計緩存的主要原因。
- 當Spring和MyBatis整合時,每次查詢之后都要進行關閉sqlsession,關閉之后數據被清空。所以MyBatis和Spring整合之后,一級緩存是沒有意義的。如果開啟二級緩存,關閉sqlsession后,會把該sqlsession一級緩存中的數據添加到mapper namespace的二級緩存中。這樣,緩存在sqlsession關閉之后依然存在。
當開啟二級緩存數據庫查詢流程先后順序為:二級緩存 -> 一級緩存 -> 數據庫
3、如何開啟二級緩存
二級緩存默認是不開啟的,需要手動開啟二級緩存,MyBatis的配置文件加上如下:
- <settings>
- <setting name = "cacheEnabled" value = "true" />
- </settings>
然后在還需要在 Mapper 的xml 配置文件中加入
cache屬性介紹
eviction:設置回收策略,默認是LRU策略。
- LRU - 最近最少回收,移除最長時間不被使用的對象
- FIFO - 先進先出,按照緩存進入的順序來移除它們
- SOFT - 軟引用,移除基于垃圾回收器狀態和軟引用規則的對象
- WEAK - 弱引用,更積極的移除基于垃圾收集器和弱引用規則的對象
flushinterval:緩存刷新間隔,緩存多長時間刷新一次,默認不清空,設置一個毫秒值
readOnly: 是否只讀;true 只讀,MyBatis 認為所有從緩存中獲取數據的操作都是只讀操作,不會修改數據。MyBatis 為了加快獲取數據,直接就會將數據在緩存中的引用交給用戶。不安全,速度快。讀寫(默認):MyBatis 覺得數據可能會被修改
size : 緩存可存放多少個元素
type: 指定自定義緩存的全類名(實現Cache 接口即可)
blocking:若緩存中找不到對應的key,是否會一直blocking,直到有對應的數據進入緩存。
注意:
- 在事務提交之前,并不會真正存儲到二級緩存,而是先存儲到一個臨時屬性,等事務提交之后才會真正存儲到二級緩存。因此需要commit事務之后才能生效。
- 如果使用的是MyBatis默認緩存,結果集對象需要實現序列化接口(Serializable),否則會報錯。
4、二級緩存適用場景
- 適合頻繁訪問且用戶對查詢結果實時性要求不是很高的查詢,
這時采用二級緩存可降低數據庫訪問量,提高數據庫的性能,例如:查詢耗時較高的統計報表SQL、按固定時間維度查詢的SQL(每月的訂單信息等等)。
- 適合查詢多寫入少的場景開啟。
因為任何對數據庫的(insert、update、delete)操作都會觸發緩存的更新,從而造成緩存失效。
5、二級緩存失效場景
- 第一次SqlSession 未提交
- 對數據庫對應的數據表執行了的(insert、update、delete)操作
6、總結
mybatis二級緩存針對大多數的業務系統都不推薦使用,因為業務系統數據操作比較頻繁、自帶的二級緩存性能也不是很高。二級緩存很難起到實際的作用。可以引用第三方緩存。
個人博客網站:https://programmerblog.xyz
本文轉載自微信公眾號「IT技術分享社區」,可以通過以下二維碼關注。轉載本文請聯系IT技術分享社區公眾號。