Mybatis不推薦使用二級快取

2021-10-04 23:22:49 字數 1260 閱讀 9900

大體就是首先根據你的sqlid,引數的資訊自己算出乙個key值,然後你查詢的時候,會先把這個key值去快取中找看有沒有value,如果有,直接返回出來,就不查詢db了。如果沒有,那麼查詢db,然後將key,value儲存到快取中,以便下次使用。

1.1mybatis的一級快取是基於sqlsession為生命週期的

當你這個session沒有了,快取就沒有了,其次當你sql執行!isselect語句的時候,快取也會被直接全部清理掉以保證資料一致性。

errorcontext.instance().resource(ms.getresource()).activity("executing an update").object(ms.getid());

if (closed) throw new executorexception("executor was closed.");

//清理快取

clearlocalcache();

return doupdate(ms, parameter);

} //清理快取,並且!isselect語句的flushcache都是預設為true的。

flushcacheifrequired(ms);

return delegate.update(ms, parameterobject);

}1. 只能在【只有單錶操作】的表上使用快取

不只是要保證這個表在整個系統中只有單錶操作,而且和該錶有關的全部操作必須全部在乙個namespace下。

2. 在可以保證查詢遠遠大於insert,update,delete操作的情況下使用快取

這一點不需要多說,所有人都應該清楚。記住,這一點需要保證在1的前提下才可以!

為什麼避免使用二級快取

select * from user_role a,role b where a.roleid = b.roleid and a.userid = #

使用pagehelper進行分頁時,二級快取不能使用。

看到這裡,實際上就是說,二級快取不能用。整篇文章介紹這麼多也沒什麼用了。

想更高效率的使用二級快取是解決不了了。

但是解決多表操作避免髒資料還是有法解決的。解決思路就是通過***判斷執行的sql涉及到那些表(可以用jsqlparser解析),然後把相關表的快取自動清空。但是這種方式對快取的使用效率是很低的。

設計這樣乙個外掛程式是相當複雜的,既然我沒想著去實現,就不廢話了。

最後還是建議,放棄二級快取,在業務層使用可控制的快取代替更好。

參考博文:

關閉二級快取 Mybatis一級快取 二級快取詳講

首先,我們先看一下這個標題 查詢快取 那就說明跟增 刪 改是沒有任何關聯的,只有在查詢時,才會遇到快取,增刪改不涉及!查詢快取目前mybatis中提供了兩個,分別是 一級快取 二級快取 所以,sqlsession的快取,是屬於一級快取 那,又有什麼用呢?比如,我們現在資料庫中有兩條資料,分別是張三跟...

mybatis查詢快取之一級快取和二級快取詳細解析

一級快取是mybatis預設就幫我們開啟的,我們不需要多做配置,但是我們得知道其中原理,否則我們也不知道怎麼使用,也不知道我們到底有沒有一級快取。上面第二部分說過一級快取的作用域是同乙個sqlsession,sqlsession的作用就是建立和資料庫的會話,我們對資料庫表的增刪改查都是通過sqlse...

mybatis二級快取

配置檔案 不用配置也是預設開啟的 在sqlmapconfig.xml中 cacheenabled value true 如果不需要二級快取,可以在設定禁用二級快取 select 這樣每次都是從資料庫中讀取 在執行insert,update,delete後會重新整理快取 清空快取 可以設定不重新整理 ...