Mybatis 支持兩級緩存,分別是一級緩存(session 級別,又稱本地緩存)和二級緩存(namespace 級別,又稱全局緩存);
其中一級緩存默認開啓,在於數據庫相同的會話期間查詢到的數據會放在本地緩存,之後再查詢相同的數據會直接從本地緩存中取;但在四種情況下,一級緩存會失效:
1、使用不同的會話請求相同的數據;
2、使用相同的會話,請求不同的數據;
3、使用相同的會話,在請求之間執行了增刪改操作,不論該操作是否針對一級緩存中的數據;
4、使用相同的會話,在請求之間主動清楚了一級緩存(session.clearCache());
二級緩存默認開啓(但未配置),工作機制爲:當使用 session 查詢完數據之後將數據先保存在一級緩存中,在 session 關閉時,將一級緩存的數據取出並放進與之對應的 map 中,不同的 namespace 之間不共享 map;使用流程:
1)開啓全局緩存配置;
2)在 mapper.xml 文件中配置使用二級緩存(因爲二級緩存是基於 namespace 的,每個 mapper.xml 文件對應一個 namespace)
3)對應的 POJO 或者 PO 必須實現序列化接口(因爲當 readOnly=false 時,緩存在返回數據的時候會使用到序列化的技術)
注意事項:
1)對於首次查詢到的數據,默認都是放在一級緩存中的,只有當 session 提交或者關閉之後,數據纔會轉移到二級緩存中,也就是說在 session 提交或者關閉之前,二級緩存中是沒有相關數據的;
2)cache 標籤中中的 cacheEnabled=false 只會關閉二級緩存,而不會關閉一級緩存;select 標籤中的 useCache=false 也只會關閉二級緩存,優先級高於 cache 標籤;
3)對於每一個增刪改標籤中都有 flushCache 屬性,當 flushCache=true時,每次執行完增刪改之後會同時清空一級緩存和二級緩存;對於查詢標籤,默認 flushCache=false,當 flushCache=true 時,每個查詢操作執行完,都會清空一級緩存和二級緩存;
4)session.clearCache 只會清空一級緩存;
5)localCacheScope 全局設置可以配置一級緩存的作用域,默認值爲 session(使用一級緩存),當設定值爲 statement 時,相當於禁用一級緩存;
第三方緩存整合:
1)導入第三方緩存的 jar 包;
2)導入 Mybatis 與第三方緩存的適配包(GitHub 上的 Mybatis 頂級項目下);
3)在 mapper.xml 中使用 cache 標籤,通過 type 屬性指定適配包接口的全類名。