2015-10-07 4 views
2

Использование Spring 3.2 с EhCache 2.9. Я аннотированный метод нулевого параметра следующим образом:Spring @Cacheable не кэширование

@Cacheable(value="myList", key="#result.method.name") 
protected List<MyObject> getMyList() { 
    //db query 
    //return list of results 
} 

Ehcache конфигурации:

<cache name="myList" 
    statistics="true" 
    maxEntriesLocalHeap="1"  
    timeToLiveSeconds="3600"> 
    <persistence strategy="none" /> 
</cache> 

я хотел бы результаты базы данных для кэширования. Поскольку этот метод не имеет параметров, я выбрал имя метода как ключ кэш.

Когда я проверяю это, база данных попадает во все вызовы метода, и я не уверен, почему. Есть идеи?


UPDATE

Таким образом, после устранения неполадок, я нашел кое-что интересное. В настоящее время метод getMyList (по которому определяется кеширование) находится в том же классе, который его вызывает. Этот метод в основном вызывает DAO для запроса списка. Если я перемещаю getMyList на другой класс, который просто действует как прокси-сервер, а затем меняю исходный invoker для вызова этого нового прокси вместо этого, тогда работает кеширование. Я не могу объяснить, почему. Любой вход?

ответ

9

Представьте, что вы идете в зоопарк. Вы проходите через вход один раз и оплатите свою запись. Впоследствии вы можете посетить Львов, Тигров и так далее ... Вам не нужно платить каждый раз, потому что вы сделали это, когда вошли. Если вам становится скучно и вы хотите отправиться в другой зоопарк, вам нужно выйти, перейти к следующему и снова заплатить.

Ваш класс зоопарк, ваши методы - животные, а кэш-прокси - это вход. Когда кто-то называет ваш класс, он один раз проходит через кеш. Когда она входит и вызывает другие методы одного и того же класса, она снова не проходит через Кэш. Только когда вы выходите и снова, вы проходите через Кэш.

Существует неприятный трюк вы можете использовать, чтобы переопределить это называется впрыснуть себе:

public class YourClass { 
    @Autowired 
    private YourClass instance; 

    @Cacheable 
    public String method1() { 
      // now you go through the cache again 
      return instance.method2(); 
    } 

    @Cacheable 
    public String method2() { 
      return "2"; 
    } 
} 
+0

спасибо Рубену. Ты просто сделал мой день - боролся с этим. Аналогия зоопарка идеальна! – Tarun