通過上篇文章我們已經知道,mybatis 一級快取的最大共享範圍為 sqlsession,即一次會話中,而且有可能會因為快取沒更新而導致髒讀問題。如果需要在多個 sqlsession 中共享快取,那麼就需要開啟二級快取。
sqlsession 的建立會借助 sqlsessionfactory,而defaultsqlsession
可由defaultsqlsessionfactory#opensession
獲得,executor 通過configuration#newexecutor
方法獲得,該方法會檢查cacheenabled
配置,開啟就意味著啟用二級快取:
mybatis 配置檔案通過如下配置開啟:
cachingexecutor 使用了裝飾器模式,delegate 即為被裝飾的 executor 物件,tcm 為transactionalcachemanager
型別,tcm 管理了以 namespace 為單位的快取。
先看putobject
方法,內部呼叫了gettransactionalcache
方法,該方法從transactionalcaches
中取到了具體的transactionalcache
,這裡以 namespace 為單位的快取作為 key,將這個 cache 進行再包裝的transactionalcache
作為值,transactionalcache
處理了事務相關的一些特性。
快取的獲取與一級快取無異,都封裝在executor#query
中:
區別是二級快取通過transactionalcachemanager
來操作快取。
在預設的設定中 select(executor#query
) 語句不會重新整理快取,insert/update/delte (executor#update
)會重新整理快取。
已經知道在executor#query
方法中如果快取沒命中,那麼從資料庫中查詢後會將資料新增到快取中,但實際上此時還沒有將資料放入快取(hashmap
),那tcm.putobject
語句把資料放到了**呢 ?
tcm.putobject
會根據 cache (作為 key)從transactionalcachemanager#transactionalcaches
中得到包裝後的transactionalcache
,再呼叫其transactionalcache#putobject
方法:
通過變數名就能知道entriestoaddoncommit
在呼叫commit
時才會真正放入快取的 hashmap 中,事實也是如此:
entriesmissedincache
用於統計命中率。
mybatis二級快取
配置檔案 不用配置也是預設開啟的 在sqlmapconfig.xml中 cacheenabled value true 如果不需要二級快取,可以在設定禁用二級快取 select 這樣每次都是從資料庫中讀取 在執行insert,update,delete後會重新整理快取 清空快取 可以設定不重新整理 ...
mybatis 二級快取
一 mybatis 二級快取 3 mybatis 預設二級快取未開啟 內建是支援二級快取的。但是由於本身是資料庫管理元件 所以快取並不好用 所以還是要用第三方的快取機制。典型的 ehcache 二 二級快取的常見演算法 lru least recently used 這種演算法是在每個物件中維護乙個...
Mybatis二級快取
原文找不到了,如果作者看到了可以留下位址,我再加上引用 sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。2.1 開啟二級快取 2....