Mybatis的緩存包括一級緩存和二級緩存。
一級緩存是SqlSession級別,在同一個SqlSession對象中使用,是自動開啟,不能關閉,只能清除;二級緩存mapper級別,可在多個SqlSession中共享,需要手動開啟。
一級緩存
同一個SqlSession對象,在沒有收到改變數(shù)據(jù)的請求之前,第二次查詢直接從緩存中取出上次查詢的結(jié)果。
緩存失效:1.不是同一個SqlSession對象 2.兩次的查詢條件不同 3.在兩次查詢之間,有增、刪、改commit,會清空緩存 4.兩次之間手動清空緩存clearCache()。
二級緩存
1.mybatis的全局配置文件中手動開啟:
<settings><setting name="cacheEnabled" value="true" /></settings>
2.在相應的mapper映射文件中 加入
<mapper namespace="...">...<cache eviction="FIFO" />...</mapper>"
緩存失效:在兩次查詢之間,有增、刪、改commit,會清空緩存。mapper中的所有緩存綁定在同一個命名空間中,一條語句對數(shù)據(jù)的更改會刪除所有的mapper級緩存,可以通過配置useCache 和 flushCache改變默認的方式,實現(xiàn)每條語句與mapper的緩存交互。
- 禁用
<select>的二級緩存,useCache="false",默認為true
針對每次查詢都去數(shù)據(jù)庫查詢數(shù)據(jù)
<select id="getIyId" parameterType="java.lang.Integer" ... useCache="false">
4.刷新某個<select>使用flushCache
// 每條語句的flushCache 和 useCache的默認方式
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>
- 默認二級緩存是關閉的,可以設置全局打開,但在使用中一般是針對某個mapper的namespace打開二級緩存,所有的select都會打開二級緩存。
<mapper namespace="***">
<cache eviction="LRU" flushInterval="10000"/>
或
<mapper namespace="***">
</cache>
需要關閉namespace下的某個查詢的二級緩存
<select *** useCache="false">
可選擇的回收策略
LRU – 最近最少使用的:移除最長時間不被使用的對象。(默認)
FIFO – 先進先出:按對象進入緩存的順序來移除它們。
SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。
WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。