MyBatis 快取 下 二級快取

2021-09-01 22:57:44 字數 2070 閱讀 2051

通過上篇文章我們已經知道,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....