【问题标题】:Spring Caching: Enable/Disable Cache via application.properties at runtimeSpring Caching:在运行时通过 application.properties 启用/禁用缓存
【发布时间】:2018-08-21 04:32:40
【问题描述】:

鉴于我有一些可缓存的方法,是否可以通过更改 application.properties 文件中的属性来实时启用/禁用其使用,或者是一个好主意? 例如:

我的 application.properties 文件有:UseBookCache=true

@Cacheable(cacheNames="books", condition = "${UseBookCache}")
public Book getByIsbn(String isbn){
    //Return book
}

我想通过设置UseBookCache=false在运行时禁用缓存

我不想禁用所有缓存,只禁用这个特定实例。这是满足我需要的最佳方式吗?

【问题讨论】:

  • 您能解释一下为什么需要禁用缓存吗?也许你的问题可以用更好的方式解决。
  • 我有多个缓存,但如果我想将内存用于其他用途,我可能需要在运行时禁用一个。我想通过 AWS S3 中的一些设置来切换它。
  • 我明白,这是一个有趣的用例。我认为@will 答案应该可以工作,但它会禁用缓存以获取新结果,它不会驱逐以前的值,因此缓存内容可能仍在使用内存,直到值被驱逐或过期。跨度>
  • 如果你在上下文中注册了一个bean解析器,你可以通过environment bean解析属性:@Cacheable(cacheNames="books", condition = "@environment.getProperty('UseBookCache')")

标签: java spring caching


【解决方案1】:

我不建议在运行时禁用此类功能,因为很难追踪发生的情况(除非您记录配置和结果),而且它会极大地改变您应用的行为。

注解的属性值不能在运行时改变,需要重启应用。

另请注意,如果缓存中有给定参数的条目,则不会调用该方法并且将无法记录任何内容。

这个注解可以读取一个参数值来决定是否使用缓存。 This other SO answer 可能会有所帮助:

一种解决方法您可以使您的方法有条件 基于参数的缓存。缓存注释支持这样的 通过采用 SpEL 的条件参数实现功能 计算结果为真或假的表达式。

@Cacheable(cacheNames="book", condition="#cached == false") public Book findBook(boolean cached)

如文档中所述。 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2017-04-12
    • 2019-11-14
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多