MyBatis中開啓查詢緩存及flushCache與useCache的使用

本篇爲MyBatis查詢緩存及配置筆記,內容爲對一些相關文章的整合,很多文章都只介紹關於MyBatis緩存的一部分內容相對零散,以此篇文章進行相關整合,以節省廣大開發者翻閱相關文檔的時間和精力

Mybatis查詢緩存簡介

一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個數據結
構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共
用二級緩存,二級緩存是跨SqlSession的。

工作原理
一級緩存
在這裏插入圖片描述
一級緩存工作原理圖
第一次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有1的用戶,如果有的話拿去用,如果沒有去數據庫中查去。得到用戶信息放入一級緩存中去。如果SqlSession去執行commit操作(執行插入、刪除、更新)的話,清空SqlSession中的一級緩存,這樣做就是爲了讓緩存中的數據保持最新,避免用戶讀到錯誤的數據。

二級緩存

在這裏插入圖片描述

                                        二級緩存工作原理圖

首先得開啓二級緩存,sqlSession1去查詢用戶id爲1的用戶信息,查詢到用戶信息會將查詢數據存儲到二級緩存中。
如果SqlSession3去執行相同 mapper下sql,執行commit提交,清空該 mapper下的二級緩存區域的數據。sqlSession2去查詢用戶
id爲1的用戶信息,去緩存中找是否存在數據,如果存在直接從緩存中取出數據。
一級緩存和二級緩存的區別
二級緩存的範圍更大,多個sqlSession可以共享一個UserMapper的二級緩存區域。UserMapper有一個二級緩存區域(按namespace分) ,其它mapper也有自己的二級緩存區域(按namespace分)。
每一個namespace的mapper都有一個二緩存區域,兩個mapper的namespace如果相同,這兩個mapper執行sql查詢到數據將存在相同 的二級緩存區域中。
mybaits的二級緩存是mapper範圍級別的緩存,所以我們需要開啓二級緩存,並在Mapper文件中開啓具體的緩存配置
MyBatis中開啓二級緩存及flushCache與useCache的使用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器啓用緩存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查詢時,關閉關聯對象即時加載以提高性能 -->
<setting name="lazyLoadingEnabled" value="false" />
<!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允許使用列標籤代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 對於批量更新操作緩存SQL以提高性能  -->
<setting name="defaultExecutorType" value="REUSE" />
<!-- 數據庫超過25000秒仍未響應則超時 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<mappers>
<!--<mapper resource="dao/mysql/CtdAuthCommonMapper.xml"/>-->
</mappers>
</configuration>

第二步:在具體的mapper.xml中開啓二級緩存。

在MyBatis的XML文件中可以

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ctd.cmp.loganalyse.bean.pojo.mapper.CtdBizMetricsMapper">
    <!-- 緩存10分鐘 -->
    <cache eviction="FIFO" flushInterval="600000" size="4096" readOnly="true"/>
   <select id="save" parameterType="XX" flushCache="true" useCache="false"> </select>
</mapper>

各個屬性意義如下:

eviction:緩存回收策略

1. 
      LRU:最少使用原則,移除最長時間不使用的對象
2. 
     FIFO:先進先出原則,按照對象進入緩存順序進行回收
3. 
     SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象
4. 
     WEAK:弱引用,更積極的移除移除基於垃圾回收器狀態和弱引用規則的對象

flushInterval:刷新時間間隔,單位爲毫秒,這裏配置的100毫秒。如果不配置,那麼只有在進行數據庫修改操作纔會被動刷新緩存區
size:引用額數目,代表緩存最多可以存儲的對象個數
readOnly:是否只讀,如果爲true,則所有相同的sql語句返回的是同一個對象(有助於提高性能,但併發操作同一條數據時,可能不安全),如果設置爲false,則相同的sql,後面訪問的是cache的clone副本。
可以在Mapper的具體方法下設置對二級緩存的訪問意願:

如果沒有去配置flushCache、useCache,那麼默認是啓用緩存的

1.flushCache默認爲false,表示任何時候語句被調用,都不會去清空本地緩存和二級緩存
2. useCache默認爲true,表示會將本條語句的結果進行二級緩存。
3. 在insert、update、delete語句時: flushCache默認爲true,表示任何時候語句被調用,都會導致本地緩存和二級緩存被清空。 useCache屬性在該情況下沒有。update 的時候如果 flushCache=“false”,則當你更新後,查詢的數據數據還是老的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章