1、一級緩存:
MyBatis默認開啟了一級緩存,一級緩存是在sqlSession層面進行緩存的。 即同一個SqlSession多次調用同一個Mapper和同一個方法的同一個參數,只會進行一次數據庫查詢,然后把數據緩存到緩沖中,以后直接從緩存中直接取出,不會直接查詢數據庫。
但是不同的SqlSession對象,因為不同的SqlSession都是相互隔離的,所以相同的Mapper、參數和方法,它還是會再次發送。
2、二級緩存:
為了克服一級緩存不同SqlSession對象引發的問題,需要開啟二級緩存。二級緩存是緩存的zaiSqlSessionFactory層m面給各個SqlSession對象共享。默認二級緩存是不開啟的,需要手動開啟。
2.1 、開啟二級緩存的配置:
在xx-mapper.xml文件中配置:
<!-- 開啟二級緩存(默認參數) --> <cache/>
默認的參數屬性:
-
-
- 映射文件的所有的 select、insert、update和delete語句會刷新緩存
- 緩存會使用默認的 Least Recently Used(LRU,最近最少使用原則)的算法回收緩存空間
- 根據時間表,比如 No Flush Interval,(CNFI,沒有刷新間隔),緩存不會以任何時間順序來刷新
- 緩存會存儲列表集合或對象(無論查詢方法還回什么)的1024個引用
- 緩存會被視為是read/write(可讀/可寫)的緩存,意味着對象檢索是不共享的,而且可以很安全的被調用者修改,不干擾其它調用者調用或現成的潛在修改。
-
自定義二級緩存參數:
<!-- 開啟二級緩存 -->
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
二級緩存的各個參數屬性:
-
-
- eviction:緩存回收策略:
-
- LRU:最少使用原則,移除最長時間不用的對象
- FIFO:先進先出原則,按照對象進入緩存的順序進行回收
- SOFT:軟引用,移除基以垃圾回收器和軟引用規則的對象
- WEAK:弱引用,更積極的移除基以垃圾回收器和軟引用規則的對象
- flushInterval:刷新時間間隔,單位為毫秒。如果不配置,那么只進行數據可修改操作才會被動刷新緩存區
- size:引用額數目,代表緩存的最多可以存儲的對象個數
- readOnly:是否可讀,如果為true,則所有的sql語句還回同一個對象(有助於提高性能,但操作同一條數據時,可能不安全),如果是false,則相同的SQL語句后面訪問cache的clone副本
可以在Mapper的具有方法下設置對二級緩存的訪問意願:
-
-
- userCache配置:
-
如果一條語句每次都需要最新的數據,就意味着每次都需要從數據庫查詢數據,可以把這個屬性設置為false,如:
<select id="selectAll" resultMap="BaseResultMap" useCache="false">
-
-
-
flushCache刷新緩存(就是清空緩存)
-
-
二級緩存默認會在insert、update、delete操作后刷新緩存,可以手動配置不更新緩存,如下:
<update id="updateById" parameterType="User" flushCache="false" />