首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在春季启动时加载@Cache?

如何在春季启动时加载@Cache?
EN

Stack Overflow用户
提问于 2015-01-14 10:25:20
回答 7查看 40.2K关注 0票数 17

我正在使用spring-cache来改进数据库查询,其工作原理如下所示:

代码语言:javascript
复制
@Bean
public CacheManager cacheManager() {
    return new ConcurrentMapCacheManager("books");
}

@Cacheable("books")
public Book getByIsbn(String isbn) {
    return dao.findByIsbn(isbn);
}

但是现在我想在启动时预先填充完整的图书缓存。这意味着我想调用dao.findAll()并将所有值放入缓存中。本例程不应仅定期安排。

但是如何在使用@Cacheable时显式填充缓存?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-02-04 00:10:10

只需像以前一样使用缓存,添加一个调度程序来更新缓存,下面是代码片段。

代码语言:javascript
复制
@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将返回一个参数的对象(默认情况下)。否则,在BookService中公开BookService方法,以避免直接使用cacheManager。

代码语言:javascript
复制
@CachePut(value = "books", key = "#book.isbn")
public Book putToCache(Book book) {
    return book;
}
票数 25
EN

Stack Overflow用户

发布于 2018-11-12 12:17:05

在使用@PostConstruct时,我遇到了以下问题:--尽管调用了我想要缓存的方法,但是在从swagger调用它之后,它仍然没有使用缓存的值。后来又叫了一次。

这是因为@PostConstruct缓存某些东西为时尚早。(至少我认为这就是问题所在)

现在,我在启动过程中使用它更晚了,它的工作没有问题:

代码语言:javascript
复制
@Component
public class CacheInit implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
       //call service method
    }

}
票数 13
EN

Stack Overflow用户

发布于 2017-11-30 23:50:48

一个选项是在启动时使用CommandLineRunner填充缓存。

从官方的CommandLineRunner文档来看,它是:

接口,用于指示当bean包含在SpringApplication中时,它应该运行。

因此,我们只需要检索所有可用书籍的列表,然后使用CacheManager填充图书缓存。

代码语言:javascript
复制
@Component
public class ApplicationRunner implements CommandLineRunner {
    @Autowired
    private BookDao dao;

    @Autowired
    private CacheManager cacheManager;

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("books");
    }

    @Override
    public void run(String... args) throws Exception {

        List<Book> results = dao.findAll();

        results.forEach(book -> 
            cacheManager.getCache("books").put(book.getId(), book));
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27940704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档