是否可以配置Spring@Cacheable
,以便在缓存未命中时,对可缓存方法的调用将被阻止,直到可缓存方法执行一次并填充缓存?
在我的例子中,我处理的是数据库中的数据,这些数据不会经常更改。事实上,如果这些数据更改,则需要重新启动应用程序。我可以创建@PostConstruct
方法,并在每个服务启动时初始化数据,但这似乎不像@Cacheable
注释那样“优雅”。
我计划将EhCache与Spring@Cacheable
注释一起使用。
更新:
以下是我在尝试使用@PostConstruct时遇到的一些问题,以防其他人遇到这些问题@PostConstruct
方法不能是@Transactional
,因为它们在设置对象的属性之后运行,而不是在配置整个spring上下文之后运行。因此,您不能假设TX管理器是在调用@PostConstruct
方法时全部设置和配置的。解决方法是实现ApplicationListener
并手动注入TransactionTemplate。。。使用@Cacheable
可以简化许多额外的工作。
ehcache-spring注释中的(注释名称相同)@Cacheable
直接支持“并发未命中时阻塞”。只需设置selfPopulating=true
。
springxml配置也比使用spring@Cacheable
干净得多。
最大的缺点是您将被绑定到ehcache,并且无法连接其他实现(例如,对单元测试有用)。
但是您也可以这样做来阻止调用,直到缓存可用
@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
}
荣誉
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功能? 直接通过你的缓存提供程序。缓存抽象是…好吧,抽象不是缓存实现 因此,如果你