MyBatis系列 快取

2021-10-21 23:50:09 字數 3119 閱讀 2870

mybatis一級快取預設是開啟的,而且不能關閉。至於一級快取為什麼不能關閉,mybatis核心開發人員做出了解釋:mybatis的一些關鍵特性(例如通過和建立級聯對映、避免迴圈引用(circular references)、加速重複巢狀查詢等)都是基於mybatis一級快取實現的。

mybatis提供了乙個配置引數localcachescope,用於控制一級快取的級別,該引數的取值為sessionstatement

sqlsession提供了面向使用者的api,但是真正執行sql操作的是executor元件。executor採用模板方法設計模式,baseexecutor類用於處理一些通用的邏輯,其中一級快取相關的邏輯就是在baseexecutor類中完成的

baseexecutor類中維護了兩個perpetualcache屬性,**如下:

public

abstract

class

baseexecutor

implements

executor

}

public

list

query

throws sqlexception

public

list

query

throws sqlexception

list

list;

tryelse

}finally

if(querystack ==0)

// issue #601

deferredloads.

clear()

;// 當localcachescope = statement時,清空快取。

if(configuration.

getlocalcachescope()

== localcachescope.statement)

}return list;

}

在實際生產中務必將mybatis的localcachescope屬性設定為statement,避免其他應用節點執行sql更新語句後,本節點快取得不到重新整理而導致的資料一致性問題。

mybatis二級快取的使用比較簡單,只需要以下幾步:

在mybatis主配置檔案中指定cacheenabled屬性值為true。

>

...name

="cacheenabled"

value

="true"

/>

settings

>

eviction

="fifo"

flushinterval

="60000"

size

="512"

readonly

="true"

/>

"list"

flushcache

="false"

usecache

="true"

resulttype

="user"

>

select * from user

select

>

通過上面的配置,mybatis的二級快取就可以生效了。執行查詢操作時,查詢結果會快取到二級快取中,執行更新操作後,二級快取會被清空。

mybatis二級快取是通過cachingexecutor實現的。configuration類提供了乙個工廠方法newexecutor(),該方法返回乙個executor物件。**如下:

public executor newexecutor

(transaction transaction, executortype executortype)

else

if(executortype.reuse == executortype)

else

if(cacheenabled)

executor =

(executor) interceptorchain.

pluginall

(executor)

;return executor;

}

如果cacheenabled屬性值為true(開啟了二級快取),則使用cachingexecutor對普通的executor物件進行裝飾,cachingexecutor在普通executor的基礎上增加了二級快取功能。

cachingexecutor類中維護了乙個transactionalcachemanager例項,transactionalcachemanager用於管理所有的二級快取物件。cachingexecutor**如下:

mybatis官方提供了乙個mybatis-redis模組,該模組用於整合redis作為二級快取。使用步驟如下:

首先需要引入該模組的依賴;

最後,需要在classpath下新增redis.properties檔案,配置redis的連線資訊。

美團技術團隊-聊聊mybatis快取機制

mybatis 3原始碼深度解析

Mybatis系列之 快取機制

正如大多數持久層框架一樣,mybatis 同樣提供了一級快取和二級快取的支援 一級快取 基於perpetualcache 的 hashmap本地快取,其儲存作用域為session,當session flush或close之後,該session中的所有 cache 就將清空。3.對於快取資料更新機制,...

hibernate快取,mybatis快取詳解

hibernate的快取有一級快取,二級快取,查詢快取。一級快取 很簡單,session級別的快取,通過get,update可以將物件放到一級快取中。二級快取 sessionfactory級別的快取,通過get,list可以將物件放到二級快取中,這裡我必須細講一下,list雖然能夠把物件放入二級快取...

MyBatis學習系列 二級快取

發表於 2016 6 16 7 26 19 4922人閱讀 分類 框架技術 mybatis sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快...