首先,不建議使用它,由於很容易出現髒數據,因此去百度一把使用redis或者memCache去實現更高層級的統一緩存,避免出現髒數據。java
從Mybatis 的官方文檔就能夠看出來很是的簡單,估計他們本身都不推薦使用此功能。redis
說說它的用法吧。sql
Mybatis除了一級緩存外,還擁有二級緩存,它是針對一個mapper文件的,被多個SqlSession共享,開啓二級緩存後數據查詢流程是:二級緩存 -> 一級緩存 -> 數據庫數據庫
它只有當SqlSession更新完成或者回滾完成後纔會更新,且增刪改操做不能設置flushCache=true。在實際變成過程當中就意味着必須顯示的提交或者回滾或者關閉SqlSession才能觸發查詢結果被更新到緩存中緩存
開啓二級緩存,步驟以下:安全
1.在全局配置文件中的<setting>標籤中配置<setting name="cacheEnabled" value="true"/>session
2.在mapper文件中添加<cache>標籤,該標籤配置後默認具備下面的能力併發
2.1緩存mapper文件中的全部select結果app
2.2增刪改會馬上刷新一、2級緩存性能
2.3緩存滿後清理規則爲LRU(a Least Recently Used)
2.4緩存默認大小爲1024
2.5緩存無自動刷新
2.6緩存是讀寫模式
<cache>標籤的幾個屬性:
eviction:緩存清理規則,取值有LRU ,FIFO ,SOFT ,WEAK四種方式 ,默認值爲LRU
flushInterval:設置自動刷新時間,默認值爲不設置
size:設置緩存能夠存放引用的大小,默認值爲1024
readOnly:設置緩存是否只讀,取值有TRUE和FALSE,默認值爲FALSE,若是爲TRUE,則全部相同的sql語句返回的是同一個對象(有助於提升性能,但併發操做同一條數據時,可能不安全,但速度更快),若是設置爲FALSE,則相同的sql,後面訪問的是cache的clone副本
就算開啓了二級緩存,你依然能夠在<select>中設置useCache="false"來關閉該查詢結果被更新到緩存中
舉例:
SqlSession session1 = getSqlSession(); SqlSession session2= getSqlSession(); CustMapper mapper1 = session1.getMapper(CustMapper.class); CustMapper mapper2 = session2.getMapper(CustMapper.class); //二級緩存須要手工開啓,具體方法是 //1.<setting name="cacheEnabled" value="true"/> //2.在Sql配置文件中加入<cache></cache>標籤 Cust cust1 = mapper1.getCustById(1); session1.commit(); //session1.close(); Cust cust2 = mapper2.getCustById(1);
注:若是關聯的多表查詢在不配置<cache-ref>的狀況下會出現髒數據,好比
在同一個業務邏輯中查帳戶信息(包含了客戶信息),接着更新了該帳戶的客戶信息表,再查該帳戶信息,客戶信息不會被更新。有一個辦法是在客戶的mapper文件中使用<cache-ref>標籤應用帳戶的mapper文件
另外Mybatis提供了Cache接口實現自定義緩存,使用該接口能夠對接redis等第三方庫實現更有用的緩存功能
若是對Mybatis緩存還須要更詳細的瞭解,推薦你們去看看你真的會用Mybatis的緩存麼,不知道原理的話,容易踩坑哦