MyBatis加強(1)~緩存機制(一級緩存、二級緩存、第三方緩存技術redis、ehcache)
- 2022 年 2 月 11 日
- 筆記
- 緩存機制(一級緩存、二級緩存、第三方緩存技術redis、ehcache)
一、緩存機制
使用緩存可以使應用更快地獲取數據,避免頻繁的數據庫交互操作,尤其是在查詢越多,緩存命中率越高 的情況下,緩存的作用就越明顯.
1、緩存原理:Map
■ 查詢時,先從緩存區查詢:找到,返回數據;找不到:到數據庫中查詢,然後把查詢的數據放進緩存,供下次使用,然後返回數據
■ 緩存是在內存
,速度肯定是比存儲在磁盤的數據庫更快,減輕數據庫的訪問壓力
2、緩存相關的概念:
(1)哪一些數據適合進行緩存:經常被查詢但是很少被修改的數據【讀遠遠大於寫操作的數據】
(2)緩存相關的屬性:
■ 命中率:從緩存中查詢出來的數量佔總查詢的數量
■ 最大對象數量:緩存區中最多存儲多少個數據,超出的時候可以寫到硬盤中【序列化】
■ 最大空閑時間:停留在緩存空間的時間,避免出現”佔著茅坑不拉。。。”
● 在MyBatis中實現緩存,只需實現Cache接口即可。
3、MyBatis 緩存【一級緩存 和 二級緩存】:
✿ 一級緩存
[本地緩存,默認自動開啟,不能關閉,性能提升較差]:SqlSession級別的,每次創建新的SqlSession對象,一級緩存的空間就會發生改變。不同是SqlSession對象不可以共享數據。
✿ 二級緩存
[查詢緩存,需要手動開啟和配置]:mapper級別的,作用域是mapper文件的同一個namespace。二級緩存應該和namespace綁定在一起,不同是SqlSession對象可以共享數據。
● 默認的緩存是緩存到java的進程(jvm的內存空間)中,若是緩存內容過多,會出現內存溢出(OOM),需要選擇第三方的緩存技術,例如redis、ehcache。
3-1、MyBatis中一級緩存的情況:【基於SqlSession
】
■ 一級緩存【本地緩存】,默認開啟,不能關閉。
- 好比是在SqlSession中存在一個Map,用來緩存查詢出來的對象。
■ 清空一級緩存:調用Sqlsession對象的cleanCache方法。
SqlSession session = MyBatisUtil.getSession();
//清空一級緩存
session.clearCache();
■ 一級緩存:對性能提升是有限的,每一次操作,我們都使用新的SqlSession對象,SqlSession之間不共享一級緩存。
- 真正提升性能—->二級緩存
3-2、MyBatis中二級緩存的情況:
■ 使用二級緩存的步驟:
(1) 全局配置文件中啟用二級緩存:
<settings>
<!-- 啟用二級緩存,缺省是默認啟用 -->
<setting name="cacheEnabled" value="true"/>
</settings>
(2) mapper文件中,使用cache元素,即namespce和緩存進行綁定:
<cache/>
(3)對於要放入二級緩存的對象要實現序列化接口【因為:超出緩存範圍的時候可以寫到硬盤中【序列化】】
public class Employee implements Serializable{
}
■ 使用二級緩存配置的一些細節(當啟用二級緩存後):
(1)mapper文件中所有select元素會默認使用緩存
(2)在大多數情況下,針對列表查詢【查詢多條數據】,設置為不緩存【useCache=”false”】,只有sql和參數相同時,才會使用到緩存:
<!-- mapper 文件-->
<select id="listAll" resultMap="BaseResultMap" useCache="false">
select id, name, dept_id from employee2
</select>
(3)一般,對get方法設置緩存查詢【useCache=”true”】:
<!-- mapper 文件-->
<select id="get" resultMap="BaseResultMap" useCache="true">
select id, name, dept_id from employee2 where id = #{id}
</select>
(4)默認情況下,insert、delete、update操作都會去刷新緩存,對於刪除和更改操作,刷新緩存操作是合理的,但是插入對象操作是沒必要刷新緩存的
<insert id="" flushCache="false">
</insert>
4、整合第三方緩存技術
4-1、EhCache:第三方的緩存技術
(1) 依賴【注意看好版本
】:
□ jar包的話—方式一:可以直接在github找到對應的項目,看readme提示去下載 zip包【就包含了所需要的jar包】
□ jar包的話—方式二:到maven倉庫下載對應的jar包
- ehcache-core.jar
- mybais-ehcache.jar
- slf4j-api.jar
- slf4j-log4j.jar
(2) ehcache配置:
- ehcache配置文件:ehcache.xml
- 映射文件中通過cache元素的type設置為”org.mybatis.caches.ehcache.EhcacheCache”
<!-- 映射文件中使用Ehcache技術 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
■ 配置好後就可以直接使用啦
4-2、redis緩存中間件:第三方的緩存技術
(1) 安裝redis服務 鏈接://github.com/MicrosoftArchive/redis/tags
(2) 依賴【注意看好版本
】:
- mybais-redis.jar
(3) redis配置:
- ehcache配置文件:redis.properties
- 映射文件中通過cache元素的type設置為”org.mybatis.caches.redis.RedisCache”