Issue
I'm using spring-cache to improve database queries, which works fine as follows:
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("books");
}
@Cacheable("books")
public Book getByIsbn(String isbn) {
return dao.findByIsbn(isbn);
}
But now I want to prepopulate the full book-cache on startup. Which means I want to call dao.findAll()
and put all values into the cache. This routine shall than only be scheduled periodically.
But how can I explicit populate a cache when using @Cacheable
?
Solution
Just use the cache as before, add a scheduler to update cache, code snippet is below.
@Service
public class CacheScheduler {
@Autowired
BookDao bookDao;
@Autowired
CacheManager cacheManager;
@PostConstruct
public void init() {
update();
scheduleUpdateAsync();
}
public void update() {
for (Book book : bookDao.findAll()) {
cacheManager.getCache("books").put(book.getIsbn(), book);
}
}
}
Make sure your KeyGenerator
will return the object for one parameter (as default). Or else, expose the putToCache
method in BookService
to avoid using cacheManager directly.
@CachePut(value = "books", key = "#book.isbn")
public Book putToCache(Book book) {
return book;
}
Answered By - Loki
Answer Checked By - Candace Johnson (JavaFixing Volunteer)