Comment charger @Cache au démarrage au printemps?
Je suis en utilisant le printemps-cache pour améliorer les requêtes de base de données, qui fonctionne comme suit:
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("books");
}
@Cacheable("books")
public Book getByIsbn(String isbn) {
return dao.findByIsbn(isbn);
}
Mais maintenant, je veux préremplir le livre-cache au démarrage. Ce qui signifie, je tiens à appeler dao.findAll()
et de mettre toutes les valeurs dans le cache. Cette routine est de seulement être programmées périodiquement.
Mais comment puis-je explicite remplir un cache lors de l'utilisation de @Cacheable
?
source d'informationauteur membersound
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser le cache comme avant, ajouter un programmateur de mise à jour du cache, de l'extrait de code ci-dessous.
Assurez-vous que votre
KeyGenerator
sera de retour l'objet d'un paramètre (par défaut). Ou d'autre, d'exposer laputToCache
méthode dansBookService
pour éviter d'utiliser cacheManager directement.Si le fait d'avoir toutes les instances de Livre en mémoire au démarrage est votre exigence que vous devez les stocker dans la mémoire tampon de vous-même.
Les mettre dans le cache avec le findAll() la méthode signifie que vous devez annoter findAll() avec @Cacheable. Ensuite, vous devez appeler findAll() au démarrage.
Mais cela ne signifie pas que l'appel à getByIsbn(String isbn) auront accès à la cache, même si l'instance correspondante a été mis dans le cache lors de l'appel de findAll().
En fait il ne sera pas parce que ehcache cache valeur de retour de méthode comme une paire clé/valeur, où la clé est calculée lorsque la méthode est appelée. Donc je ne vois pas comment il pourrait correspondre à la valeur de retour de findAll() et la valeur de retour de getByIsbn(String), car retournés types ne sont pas les mêmes et en plus de la clé ne jamais l'égaler pour toutes vos instances.
Une option serait d'utiliser la
CommandLineRunner
pour remplir le cache au démarrage.Officiel CommandLineRunner de la documentation, il est un:
Donc, nous avons juste besoin de récupérer la liste de tous les livres disponibles et puis, à l'aide de
CacheManager
nous peuplent le livre de cache.Comme Olivier l'a spécifié, depuis le printemps caches de sortie de la fonction en tant qu'objet unique, à l'aide de @cacheable notation avec findAll ne vous permettra pas de charger tous les objets dans le cache de sorte qu'ils puissent plus tard être consultées individuellement.
Une façon possible, vous pouvez charger tous les objets dans le cache est si la mise en cache de la solution utilisée vous permet de charger tous les objets au démarrage. E. g solutions comme NCache /TayzGrid fournit Cache de démarrage chargeur de fonctionnalité, qui permet de charger le cache au démarrage avec des objets à l'aide d'un cache configurable chargeur de démarrage.
Ajouter un autre bean BookCacheInitialzer
Autowire le courant de haricots BookService dans BookCacheInitialzer
dans PostConstruct méthode de BookCacheInitialzer
le pseudo-code
Alors que peuvent faire quelque chose comme
}
}