4

是否可以配置Spring @Cacheable,以便如果缓存未命中,对可缓存方法的调用会被阻塞,直到可缓存方法执行一次并填充缓存?

就我而言,我正在处理数据库中不经常更改的数据,实际上如果这些数据发生更改,则需要重新启动应用程序。我可以@PostConstruct在每个服务启动时创建方法并初始化数据,但这似乎不像@Cacheable注释那样“优雅”。

我打算将 EhCache 与 Spring@Cacheable注释一起使用。

更新:

以下是我在尝试使用@PostConstruct 时遇到的一些问题,以防其他人遇到这些问题。@PostConstruct方法不能是@Transactional因为它们在对象的属性设置之后而不是在整个弹簧上下文配置之后运行。因此,您不能假设 TX 管理器已全部通过@PostConstruct调用 time 方法进行设置和配置。解决方法是手动实现一个ApplicationListener并注入一个 TransactionTemplate ......等等许多额外的工作,这些工作通过使用@Cacheable.

4

3 回答 3

2

Spring 4.3 中添加了对同步缓存的支持:

@Service
public class FooService {

    @Cacheable(cacheNames = "foos", sync = true)
    public Foo getFoo(String id) { ... }

}

见:https ://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3

于 2016-04-10T11:29:25.000 回答
1

我不认为这@PostConstruct是不雅的,对我来说似乎是完美的解决方案。您希望仅在重新启动应用程序时调用方法。有什么更好的?

但是您也可以这样做来阻止调用,直到缓存可用

@Cacheable(cacheName="yourCache", decoratedCacheType= DecoratedCacheType.SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}

并使缓存自动刷新:

@Cacheable(cacheName="yourCache", refreshInterval=1000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
  //call database
}

荣誉

于 2012-06-29T13:16:59.270 回答
1

@Cacheable来自 ehcache-spring-annotations的(令人讨厌的注释名称相同)直接支持“并发未命中阻塞” 。刚设置selfPopulating = true

spring XML 配置也比使用 Spring 干净得多@Cacheable

最大的缺点是您将被绑定到 ehcache 并且无法连接其他实现(例如,对单元测试有用)。

于 2013-06-30T13:01:08.307 回答