2016-10-13 53 views
0
  • 春天引导版本:1.4.1.RELEASE
  • 的Ehcache版本:3.1.3
  • 操作系统:Mac 10.11.6
  • 的java:1.8.0_91

我跟着一起瓦特/ "Caching 101" with Louis Jacomet & Aurelien Broszniowski让我的脚湿与高速缓冲存储器直通使用的Ehcache 3.了Ehcache三级缓存,通过与弹簧引导和JPA

有几件事情该演示在釉料(但提简单地说)。其中之一是缓存密钥管理,现在成为应用程序的责任;因为创建的对象/数据被缓存了第一个b/f它们被持久化(整个缓存通过点),所以我们没有可用的db返回的'id'(JPA)...我们有向实体添加一个新字段以存储此缓存密钥。

因此,我创建了一个“密钥生成器”,它维护一组长的缓存密钥。精细。但是,当应用程序停止时,此集合消失。因此,如果在运行应用程序时创建了任何对象/条目,则在启动时,这些记录需要插入到应用程序缓存中,并且还需要填充缓存键(Set)。

In my sample code,我的其余控制器是与缓存交互的人,我添加了一个方法来完成此操作。它调用repository.findAll()来填充实体列表(本例中为Product)。由于每个先前持久化的实体也保存了缓存键,我遍历这个列表填充缓存;或者我认为。

@PostConstruct 
     private void initializeCacheFromDB() { 
    List<Product> productList = new ArrayList<>(); 
    repository.findAll().forEach(productList::add); 

    for (Product product : productList) { 
     // update the cache 
     // NOTE: below has no effect! 
     productCache.put(product.getCacheKey(), product); 
     // update/set the keys 
     CustomKeyGenerator.addKey(product.getCacheKey()); 
    } 

    // does nothing!!!! ... no entries so keys not associated w/ Product(s) 
    //productCache.getAll(CustomKeyGenerator.getKeysSet()); 

    System.out.println("done w/ initializeCacheFromDB()"); 
} 

但是,何时,控制台确认后,应用程序。已经开始,我导航到一个休息端点来获取所述列表,它是空的!

所以,我的问题是,如何在启动时用任何持久数据填充缓存。

回答