Mybatis 踩坑第六彈—緩存

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 屬性指定適配包接口的全類名。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章