我正在使用spring-cache来改善数据库查询,如下所示可以正常工作:
@Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("books"); } @Cacheable("books") public Book getByIsbn(String isbn) { return dao.findByIsbn(isbn); }
但是现在我想在启动时预先填充完整的图书缓存。这意味着我要调用dao.findAll()并将所有值放入缓存。该例程应仅定期进行安排。
dao.findAll()
但是在使用时如何显式填充缓存@Cacheable?
@Cacheable
像以前一样使用缓存,添加调度程序以更新缓存,下面是代码段。
@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); } } }
确保你KeyGenerator将为一个参数返回对象(默认)。否则,请公开其中的putToCache方法,BookService以避免直接使用cacheManager。
KeyGenerator
putToCache
BookService
@CachePut(value = "books", key = "#book.isbn") public Book putToCache(Book book) { return book; }