javaspringspring-cache

How to load @Cache on startup in spring?


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;
    }