Cachowanie w Springu - jakie adnotacje?

0

Mam metodę która zapisuje do bazy danych ExpensiveObject:

public ExpensiveObject save(Long id, Dto dto) { .. }

Mam też metodą która potrafi wyciągnąć to z bazy danych podając id:

public ExpensiveObject getById(Long id) {
  repository.findById(id).orElseThrow();
}

Tak naprawdę to chciałbym żeby ta pierwsza metoda również zapisywała to do jakiegoś cache postaci Map<Long, ExpensiveObject> gdzie kluczem jest id.

Natomiast ciało drugiej metody powinno się odpalać tylko jeśli w cache nie ma klucza o takim ID-ku.

Jak to tutaj obkleić adnotacjami z Spring Cache żeby to zadziałało tak jak napisałem?

Btw, w prawdziwym scenariuszu te metody robią mocno coś innego ale chciałem uprościć na maxa na potrzeby przykładu.

EDIT: Prawdopodobnie mogę dodać @Cacheable na getById(Long id) i mogłoby to działać, ale chciałbym żeby to się cachowało już przy wołaniu save, a nie dopiero przy wołaniu getById.

1

Możliwości

  1. Dodaj @Cacheable nad getById(Long id) i po prostu wywołaj getById(id) po zapisaniu żeby się zcache'owało.
  2. Użyj jakiegoś prostego cache bez magii - np. Caffeine
  3. Pobierz sobie ręcznie cache z beana CacheManager i wstaw tam podczas zapisywania + @Cacheable nad getById(Long id)
cacheManager.getCache("cache name").put(id, expensiveObject);
  1. Kombinuj dalej lepienie monstrum z adnotacjami, ale ja tutaj nie pomogę, bo nie zamierzam do tego przykładać ręki 😅
1

Polecam guava cache https://www.baeldung.com/guava-cache

3

Dodaj @Cacheable nad getById(Long id) i po prostu wywołaj getById(id) po zapisaniu żeby się zcache'owało.

Z zabawnych powodów to często nie zadziała :-)

1

Przy cache'ach warto sobie zawsze zadać dwa pytania:

  • kiedy dane w nim zawarte ekspirują?
  • jaką ma pojemność ten cache?
0

Czyli polecacie skorzystanie z zewnętrznych cache typu guava albo caffeine bez springa, zamiast z gotowca z Springa?

0
Xorxorxor napisał(a):

Czyli polecacie skorzystanie z zewnętrznych cache typu guava albo caffeine bez springa, zamiast z gotowca z Springa?

Tak, ale ja to jestem nieobiektywny bo polecam w ogóle nie korzystać ze springa :p

3

Użyj Caffeine i zrób to explicite, zamiast kombinować z adnotacjami które w 7 na 10 przypadków mogą nie zaskoczyć... Będzie cie to kosztować jakieś 2 linijki kodu :)

1

Czyli polecacie skorzystanie z zewnętrznych cache typu guava albo caffeine bez springa, zamiast z gotowca z Springa?

Spring dostarcza abstrakcję wydaję mi się, że warto bo nie jesteś uzależniony od konkretnej implementacji. Jeżeli chcesz
ręcznie wrzucać obiekty do cache możesz np. wstrzyknąć CacheManager. Natomiast później łatwo by było taki cache
wymienić dzięki temu co nie znaczy też, że samemu nie można by było sobie zrobić takiej prostej abstrakcji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.