2015-01-28 13 views
6

Sto usando l'annotazione spring e @Cacheable per memorizzare alcune voci del database. Voglio invalidare periodicamente la cache completa.Invalidate le voci @Cachable per annotazione sull'interfaccia?

Pertanto: è giusto mettere queste annotazioni su un metodo di interfaccia? O queste annotazioni devono essere posizionate sui metodi di classe (anche se hanno un corpo del metodo vuoto)?

public interface MyRepository extends CrudRepository<MyEntity, Long> { 
    @Override 
    @Cacheable("cache") 
    Airline findOne(long id); 

    @CacheEvict(value = "cache", allEntries = true) 
    @Scheduled(cron = "0 0 1 * * *") 
    void removeAll(); 
} 

L'applicazione si avvia con successo se ho la @Cacheable sul metodo di interfaccia e il @CacheEvict in un servizio. Non funziona se uso il codice sopra. Ma forse sto facendo anche le cose sbagliate?

risposta

7

Probabilmente funzionerebbe, ma suggerirei di mettere queste annotazioni sull'implementazione.

È più una questione teorica, ma la si pensa in questo modo: un'interfaccia è un contratto comune, ma la memorizzazione nella cache è un dettaglio di implementazione.

L'interfaccia può essere implementata in diversi modi, ad esempio, un giorno potresti avere un HsqlDBRepository, per il quale la memorizzazione nella cache non ha alcun senso poiché è già in memoria.

Su una nota a margine, penserei attentamente al motivo per cui è necessario "rimuovere tutto" ... a seconda di quanto accade spesso, potrebbe rendere inutilizzabile il caching - inoltre è spesso un segnale di un problema più profondo con il design. Se si desidera rimuovere le entità dopo un po 'di tempo, prendere in considerazione la possibilità di configurare timeToLive/timeToIdle - la maggior parte dei backend di cache lo supportano correttamente.

Problemi correlati