Mybatis的二級快取剖析

2021-10-08 21:53:08 字數 1915 閱讀 3104

研究mybatis的二級快取需要去扒拉下人家的源**,研究mybatis提供的官方jar包;

研究方向萬變不離其宗,就算不去看人家的源**,我們猜一猜也能猜到個大概,大概是用map快取,

然後用整串的sql+引數作為key,然後查詢結果作為value,至於是不是我們可以後面再瞅瞅。

我們主要看兩塊兒,一塊兒是cache,一塊兒是cacheingexecutor

資料結構分析

核心介面:cache

貼出來就是讓你看看,裡面沒啥乾貨

真正的資料結構來了:perpetualcache

你看,是不是驗證了我的設想,就是用了乙個map來儲存

然後我們會發現cache包下面還有乙個東西叫decorators

他的實現方式有很多種,很好奇,為毛用這麼多的實現,其實實現這麼多只是使用了乙個裝飾者模式,目的是為了給快取加上各種裝飾

decorators,單詞的意思叫裝飾,很自然的就會想到設計模式裡的裝飾者模式,如果讀者不了解裝飾者模式的可以先去了解下然後往下閱讀

fifocache

loggingcache

lrucache

scheduledcache

serializedcache

softcache

synchronizedcache

transactionalcache

weakcache

blockingcache

我們看到loggincache,猜想下就是日誌,softcache 軟引用 weakcache 弱引用 fifocahce 先進先出,一看就是給快取加上了一些功能,就是通過裝飾者模式給快取加上各種不同的自定義功能。

可以簡單的看下其中某乙個裝飾者

可以看到都是裡面包含了乙個cache,然後層次的遞進引用,引用到最後一波就是perpetualcache,反過來可以看到拿最基礎的perpetualcache一層一層的給他包裹新功能,這就是裝飾者模式的典型的應用場景

,資料結構到此基本上結束了。

核心**就是下面的這段,建議大家自己打個斷點就能理解的更形象一點,我這邊文字描述的再詳細畢竟只是我自己的理解

throws sqlexception

return list;}}

// 委託模式,交給******executor等實現類去實現方法 如果沒有快取那就得去自己跑了

return delegate. query(ms, parameterobject, rowbounds, resulthandler, key, boundsql);}

簡單的呼叫基本上就結束了,大道至簡不是麼,恭喜畢業,剩下的細節大家自己帶鐵鍬挖,只是領你入門。

1 基礎bean必須要實現序列化介面

2 查詢條件要謹慎,如果不訊息用了乙個動態的引數,比如當前時間,那麼就不適合,因為實時改變,key一直變,這時候你加了快取,效能會變差

總結:如果基礎bean沒有實現序列化介面或者是第二種情況,快取均不會生效,這時候你開啟了快取,但是快取沒卵用,效能反而會降低。

cachingexecutor描述的引用更詳細點

sprngboot中如何使用二級快取

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....