Na starcie aplikacji, ja zainicjowany ~ 20 różnych buforów:Jak mogę usunąć WSZYSTKIE pamięci podręczne w Spring Boot?
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(many many names));
return cacheManager;
}
Chcę zresetować całą pamięć podręczną w odstępie, powiedzmy co godzinę. Korzystanie z zaplanowanego zadania:
@Component
public class ClearCacheTask {
private static final Logger logger = LoggerFactory.getLogger(ClearCacheTask.class);
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
@Value("${clear.all.cache.flag}")
private String clearAllCache;
private CacheManager cacheManager;
@CacheEvict(allEntries = true, value="...............")
@Scheduled(fixedRate = 3600000, initialDelay = 3600000) // reset cache every hr, with delay of 1hr
public void reportCurrentTime() {
if (Boolean.valueOf(clearAllCache)) {
logger.info("Clearing all cache, time: " + formatter.print(DateTime.now()));
}
}
}
ile Czytam docs źle, ale @CacheEvict
wymaga ode mnie rzeczywiście dostarczyć nazwę cache, które mogą dostać się bałagan.
Jak mogę użyć @CacheEvict
, aby wyczyścić WSZYSTKIE pamięci podręczne?
Myślałam zamiast korzystania @CacheEvict
, po prostu pętli wszystkich skrytek:
cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
Zamiast hackować coś razem, czemu nie użyć odpowiedniej implementacji pamięci podręcznej, takiej jak ehcache, która obsługuje tę konfigurację, po prostu konfigurując pamięć podręczną. –
Powinienem dodać zastrzeżenie: tak, to jest głupie/hacky, ale to musi być zrobione. – iCodeLikeImDrunk
Wybrałbym opcję 2, nie próbuj używać '@ CacheEvict', ponieważ nie została do tego zaprojektowana, ale nadal jest to hack i prawdopodobnie powinieneś użyć odpowiedniej technologii buforowania. –