Spring @Cacheable 緩存不生效的問題

最近在項目中使用了Ehcache緩存,使用方式是用Spring提供的 @Cacheable 註解的方式,這種方式簡單、快速、方便,推薦使用。
在使用的過程當中,遇到了緩存不生效的狀況,通過分析處理,總結以下:
  一、Spring MVC 的Controller方法上使用 @Cacheable 註解,編譯運行都沒問題,但在調接口的時候發現接口沒走緩存,最簡單的判斷方式就是在本地啓服務,方法裏打斷點,能夠發現每次都能進入斷點,而若是走緩存的話,是不會進斷點的。
  查了不少資料,一直沒解決,最終想到了Spring 使用@Cacheable添加緩存是基於面向切面的思想作的,實際上就是使用Java動態代理,建立實例的時候注入的是代理對象,在代理對象裏調用實際的對象,這樣就能夠在實際的方法執行前,處理一下緩存的邏輯:沒有找到緩存就往下執行,執行完把結果加入到緩存中;找到緩存則直接返回緩存的結果,不調用執行實際的方法。
  而後去看了一下spring mvc的配置文件,添加上了 aop 相關的配置,重啓測試,果真緩存生效了,只有第一次進了斷點,後面都直接有結果,沒進斷點。
  下圖是添加的配置:
  

 

  二、一個方法A調同一個類裏的另外一個有緩存註解的方法B,這樣是不走緩存的。spring

  緣由就是上面說的,使用@Cacheable添加緩存實際上就是使用動態代理作的,在代理的方法先後作緩存的相應處理。這樣一來,單獨的去調方法B是有緩存的,可是若是調方法A,A裏面再去調B方法,哪怕B方法配置了緩存,也是不會生效的。緩存

         解決方法:
        a、不使用註解的方式,直接取 Ehcache 的 CacheManger 對象,把須要緩存的數據放到裏面,相似於使用 Map,緩存的邏輯本身控制
        b、把方法A和方法B放到兩個不一樣的類裏面,例如:若是兩個方法都在service接口裏,把方法B放到另外一個service裏面,這樣A方法裏調B方法,就可使用B方法的緩存
 
  測試:
  

  直接調用 test 方法,緩存是生效的;調用 hello 方法,test 方法的緩存不生效,每次都會執行一遍 test 方法裏的代碼mvc

相關文章
相關標籤/搜索