Mybatis的緩存包括一級(jí)緩存和二級(jí)緩存碳锈。
一級(jí)緩存是SqlSession級(jí)別混稽,在同一個(gè)SqlSession對(duì)象中使用佛点,是自動(dòng)開(kāi)啟双揪,不能關(guān)閉,只能清除挑宠;二級(jí)緩存mapper級(jí)別今妄,可在多個(gè)SqlSession中共享郑口,需要手動(dòng)開(kāi)啟。
一級(jí)緩存
同一個(gè)SqlSession對(duì)象盾鳞,在沒(méi)有收到改變數(shù)據(jù)的請(qǐng)求之前犬性,第二次查詢直接從緩存中取出上次查詢的結(jié)果。
緩存失效:1.不是同一個(gè)SqlSession對(duì)象 2.兩次的查詢條件不同 3.在兩次查詢之間腾仅,有增乒裆、刪、改commit推励,會(huì)清空緩存 4.兩次之間手動(dòng)清空緩存clearCache()鹤耍。
二級(jí)緩存
1.mybatis的全局配置文件中手動(dòng)開(kāi)啟:
<settings><setting name="cacheEnabled" value="true" /></settings>
2.在相應(yīng)的mapper映射文件中 加入
<mapper namespace="...">...<cache eviction="FIFO" />...</mapper>"
緩存失效:在兩次查詢之間,有增验辞、刪稿黄、改commit,會(huì)清空緩存跌造。mapper中的所有緩存綁定在同一個(gè)命名空間中杆怕,一條語(yǔ)句對(duì)數(shù)據(jù)的更改會(huì)刪除所有的mapper級(jí)緩存,可以通過(guò)配置useCache 和 flushCache改變默認(rèn)的方式壳贪,實(shí)現(xiàn)每條語(yǔ)句與mapper的緩存交互陵珍。
- 禁用
<select>
的二級(jí)緩存,useCache="false"
违施,默認(rèn)為true
針對(duì)每次查詢都去數(shù)據(jù)庫(kù)查詢數(shù)據(jù)
<select id="getIyId" parameterType="java.lang.Integer" ... useCache="false">
4.刷新某個(gè)<select>
使用flushCache
// 每條語(yǔ)句的flushCache 和 useCache的默認(rèn)方式
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>
- 默認(rèn)二級(jí)緩存是關(guān)閉的互纯,可以設(shè)置全局打開(kāi),但在使用中一般是針對(duì)某個(gè)mapper的namespace打開(kāi)二級(jí)緩存磕蒲,所有的select都會(huì)打開(kāi)二級(jí)緩存留潦。
<mapper namespace="***">
<cache eviction="LRU" flushInterval="10000"/>
或
<mapper namespace="***">
</cache>
需要關(guān)閉namespace下的某個(gè)查詢的二級(jí)緩存
<select *** useCache="false">
可選擇的回收策略
LRU – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。(默認(rèn))
FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們辣往。
SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象愤兵。
WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。