MyBatis 二級快取的開啟與配置
阿新 • • 發佈:2022-05-12
mybatis一級快取
mybatis一級快取是預設開啟的,是SqlSession級別的快取,在操作資料庫的時候需要建立一個SqlSession,其中有一個HashMap,用於儲存快取資料。不同的SqlSession之間,其快取資料的HashMap是不同的;
所以當我們多次呼叫同一個Mapper和同一個方法的同一個引數,只會進行一次資料庫查詢,然後把資料快取到緩衝中,以後直接先從快取中取出資料,不會直接去查資料庫。但是不同的SqlSession物件,因為不用的SqlSession都是相互隔離的,所以相同的Mapper、引數和方法,他還是會再次傳送到SQL到資料庫去執行,返回結果。所以我們需要根據需求開啟二級快取
mybatis二級快取
- 首先在mybatis配置檔案的節點中配置整體開啟二級快取。
<settings>
<!-- 開啟日誌 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 開啟二級快取(整體開啟) -->
<setting name="cacheEnabled" value="true"/>
</settings>
- 然後為具體的Mapper對映檔案的名稱空間進行二級快取的具體配置。
<!-- cacahe節點:配置當前名稱空間下mapper的快取 --> <cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>
- eviction代表快取回收策略,目前mybatis提供以下回收策略:
- LRU(Least Recently Used):最近最少使用的,回收最長時間不用的物件;
- FIFO(First in first out):先進先出,按照物件進入快取的順序來移除;
- SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的物件;
- WEAK:弱引用,更積極的移除基於垃圾收集器狀態和弱引用規則的物件。
- flushInterval:快取重新整理時間間隔,單位為毫秒,每經過相應時間會對快取進行重新整理,如果沒有配置,當SQL被執行的時候才會重新整理快取。
- readOnly:只讀,設定只讀為“true”意味著快取資料只能讀取而不能修改,這樣設定的好處是我們可以快速讀取快取,缺點是沒有辦法修改快取,它的預設值是false,不允許修改。
- size:引用數目,是一個整數,代表快取最多可以儲存多少的物件,該資料不宜設定過大,如果設定過大會導致記憶體溢位。
- 使快取物件的實體類實現序列化介面(Serializable),使其能夠被序列化和反序列化。
由於二級快取的資料不一定都是儲存到記憶體中,它的儲存介質多種多樣,實現序列化介面的目是二級快取可能會使用硬碟臨時儲存,所以要實現序列化介面保證物件能夠被序列化和反序列化。
只有當一級快取,SqlSession物件使用完畢後能夠關閉時,二級快取才能正常命中,否則將會出現快取命中為零的現象。
mybatis解讀
- 開啟快取的弊端是資料沒有實時性,當資料庫中的資料一旦修改,查詢的資料還是快取中的資料沒有實時性,對於某些需要實時性顯示資料的介面我們可以設定 useCache="false" ,設定該屬性後,該介面每次查詢出來都是去執行sql查詢出實時性資料。如:
<!-- 獲取文章瀏覽量 -->
<select id="findArtPageview" parameterType="com.Article" resultType="int" useCache="false">
select pageview from article where aid=#{aid}
</select>
- 清空快取,一般下執行完commit操作都需要重新整理快取,flushCache=true表示重新整理快取,這樣可以避免資料庫髒讀。但是如果你不想重新整理快取只需要這麼做:
<update id="pageviewAdd" parameterType="com.Goods" flushCache="false">
update goods set pageview=#{pageview} where gid=#{gid}
</update>
將flushCache=true改為flushCache=false就不用重新整理了
總結
- 當為select語句時:
flushCache預設為false,表示任何時候語句被呼叫,都不會去清空本地快取和二級快取。
useCache預設為true,表示會將本條語句的結果進行二級快取。
- 當為insert、update、delete語句時:
flushCache預設為true,表示任何時候語句被呼叫,都會導致本地快取和二級快取被清空。
useCache屬性在該情況下沒有。
當為select語句的時候,如果沒有去配置flushCache、useCache,那麼預設是啟用快取的,所以,如果有必要,那麼就需要人工修改配置。