Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Spring Boot] Delucidazioni sul caching

    ciao!

    sto facendo qualche test sul caching in spring boot.
    ho aggiunto queste dipendenze:
    codice:
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>6.2.3</version>
    		</dependency>
    
    
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context-support</artifactId>
    			<version>6.2.3</version>
    		</dependency>
    
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-cache</artifactId>
    			<version>3.3.2</version>
    		</dependency>
    ho attivato il caching:
    codice:
    @SpringBootApplication
    @EnableCaching
    public class TestSpringbootJavaApplication {
    
    
    	public static void main(String[] args) {
    		SpringApplication.run(TestSpringbootJavaApplication.class, args);
    	}
    
    
    }
    ho creato un model che poi rappresenterà la mia tabella:
    codice:
    @Getter
    @Setter
    @AllArgsConstructor
    public class Persona {
      private Long id;
      private String email;
    }
    ho creato un service che poi farà una query sul db:
    codice:
    @Service
    public class PersonaService {
    
    
      @Cacheable(value = "persone", key = "#id")
      public Persona getById(Long id) {
        // DO STUFF
        CacheManager cacheManager = new SimpleCacheManager();
        Cache cache = cacheManager.getCache("persone");
    
    
    
    
        return new Persona(id, "email@email.it");
      }
    }
    ecco, qui vorrei capire.
    l'eventuale controllo che i dati siano in cache li fai la libreria in autonomia?
    come faccio eventualmente a controllare che ci sia già qualcosa in cache?

    per completezza il controller:
    codice:
    @RestController
    @RequestMapping(path = "/test")
    public class TestController {
    
    
      @Autowired
      PersonaService service;
    
    
      @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
      @ResponseStatus(HttpStatus.OK)
      public String index() {
        Persona persona = service.getById(10L);
    
    
        JSONObject obj = new JSONObject();
        obj.put(persona.getId(), persona.getEmail());
    
    
        return String.valueOf(obj);
      }
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    @Service
    public class PersonaService {
      @Cacheable(value = "persone", key = "#id")
      public Persona getById(Long id) {
        // DO STUFF
        CacheManager cacheManager = new SimpleCacheManager();
        Cache cache = cacheManager.getCache("persone");
    
    
    
    
        return new Persona(id, "email@email.it");
      }
    }
    l'eventuale controllo che i dati siano in cache li fai la libreria in autonomia?
    come faccio eventualmente a controllare che ci sia già qualcosa in cache?
    No, non funziona così il caching in Spring. Spring crea un "proxy" che intercetta le chiamate al tuo service. Quando altrove fai un @Autowired del tuo PersonaService, non inietti direttamente la istanza del tuo service, ma inietti il proxy!

    La logica del proxy per quel metodo @Cacheable è semplice: l'oggetto è già in cache per quella certa chiave?
    No -> allora chiama il tuo getById reale e poi mette in cache il risultato prima di restituirlo.
    Sì -> allora restituisce direttamente l'oggetto cachato e NON invoca più il tuo getById reale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, non funziona così il caching in Spring. Spring crea un "proxy" che intercetta le chiamate al tuo service. Quando altrove fai un @Autowired del tuo PersonaService, non inietti direttamente la istanza del tuo service, ma inietti il proxy!

    La logica del proxy per quel metodo @Cacheable è semplice: l'oggetto è già in cache per quella certa chiave?
    No -> allora chiama il tuo getById reale e poi mette in cache il risultato prima di restituirlo.
    Sì -> allora restituisce direttamente l'oggetto cachato e NON invoca più il tuo getById reale.
    ciao!

    ok in sostanza è come immaginavo, "fa tutto da solo".

    grazie per la risposta e la spiegazione!!

  4. #4
    ciao!

    ho fatto qualche test aggiungendo la connessione al db.
    ho visto che se eseguo una query, poi cambio a mano qualche dato, e rieseguo la query, in effetti mi torna sempre il valore cachato.
    quindi ok corretto, funziona.

    ma la mia domanda a questo punto è, come faccio a far visualizzare i dati aggiornati?
    suppongo che se faccio un update di un record devo cancellare la cache, esatto?

  5. #5
    ok mi sono risposto da solo:
    codice:
    @Service
    public class PersonaService {
    
    
      @Autowired
      PersonaRepository repository;
    
    
      @Cacheable(value = "persone")
      public Optional<Persona> getById(int id) {
        return repository.findById(id);
      }
    
    
      @CacheEvict(value = "persone")
      public void updateById(int id) {
        Persona persona = repository.getReferenceById(id);
        persona.setEmail("e@e.it");
        repository.save(persona);
      }
    }
    o quanto meno funziona, poi non so se è la soluzione migliore.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    o quanto meno funziona, poi non so se è la soluzione migliore.
    Sì, il @CacheEvict serve proprio a quello! Se non specifichi il key, tutti i parametri del metodo formano la "chiave". Nei tuoi due metodi l'unico parametro è id, quindi la chiave è l'id che chiedi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì, il @CacheEvict serve proprio a quello! Se non specifichi il key, tutti i parametri del metodo formano la "chiave". Nei tuoi due metodi l'unico parametro è id, quindi la chiave è l'id che chiedi.
    ottimo grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.