当前位置: 首页 > 知识库问答 >
问题:

Spring@Cacheable是否可以配置为阻止缓存未命中?

牛凌
2023-03-14

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

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

我计划将EhCache与Spring@Cacheable注释一起使用。

更新:

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

共有3个答案

吉俊德
2023-03-14

ehcache-spring注释中的(注释名称相同)@Cacheable直接支持“并发未命中时阻塞”。只需设置selfPopulating=true

springxml配置也比使用spring@Cacheable干净得多。

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

白宏义
2023-03-14

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

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

荣誉

越姚石
2023-03-14

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

 类似资料:
  • 我正在使用SpringFramework 3.2编写一个java项目。4. 我有许多SQL查询需要缓存10秒钟。 我知道用注释我可以缓存函数结果。 我不明白的是如何缓存只有10秒。我知道你可以给可缓存注释添加条件,但是我很难弄清楚如何给这些条件添加时间。 如能提供有关该问题的任何信息,将不胜感激。

  • 我正在学习Spring启动与密钥斗篷作为安全系统。 Java 11和KeyClope 11.0.1 我已经在https://github.com/ajeetkumarv/myemr上传了这个项目,并遵循了3个链接的教程。首先是https://www.thomasvitale.com/introducing-keycloak-identity-access-management/ Access完美地

  • 我试图理解Java的关键字,关于在具有CPU缓存的多线程程序中写入易失性原子变量。 我已经阅读了一些教程和Java语言规范,特别是关于“订购前发生”的第17.4.5节。我的理解是,当一个线程将一个新值写入一个可变变量时,更新后的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现: > 线程可以在CPU缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句

  • 我想缓存以下结构的方法: 对于

  • 问题内容: 我正在尝试对Spring 3.1 的注释支持,并且想知道是否有任何方法可以通过设置TTL在一段时间后清除缓存的数据?现在,从我看到的内容中,我需要使用和自己清除它,并与我一起使用可以实现TTL实现,但是对于这样一个简单的任务来说似乎有点多了吗? 问题答案: 如何设置TTL / TTI /驱逐策略/ XXX功能? 直接通过你的缓存提供程序。缓存抽象是…好吧,抽象不是缓存实现 因此,如果你