mybatis一級快取預設是開啟的,而且不能關閉。至於一級快取為什麼不能關閉,mybatis核心開發人員做出了解釋:mybatis的一些關鍵特性(例如通過和建立級聯對映、避免迴圈引用(circular references)、加速重複巢狀查詢等)都是基於mybatis一級快取實現的。
mybatis提供了乙個配置引數localcachescope
,用於控制一級快取的級別,該引數的取值為session
、statement
。
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中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快...