Mybatis-二級緩存

首先,不建議使用它,由於很容易出現髒數據,因此去百度一把使用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的緩存麼,不知道原理的話,容易踩坑哦

相關文章
相關標籤/搜索