大體就是首先根據你的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後會重新整理快取 清空快取 可以設定不重新整理 ...