【问题标题】:JCache CacheResult - creating caches with the default nameJCache CacheResult - 使用默认名称创建缓存
【发布时间】:2019-07-08 11:10:26
【问题描述】:

我在 Spring 和 EhCache 中使用 JCache 注释。如果我在方法上使用 @CacheResult 而不指定缓存名称(或类上的 @CacheDefaults),则默认缓存名称将解析为完全限定的方法名称。但是,除非使用 CacheManager 显式创建,否则找不到这样的缓存。对于一些这样的启用缓存的方法,这可能是可以管理的,但如果我必须手动创建 50 个不同的缓存,则不是。

有没有办法告诉 Spring(或任何 JCache 实现者)自动创建具有默认名称的缓存(如果没有找到)?这将允许我在任何方法上使用@CacheResult,而不必每次都去更新缓存配置。

【问题讨论】:

    标签: java spring jcache


    【解决方案1】:

    有没有办法告诉 Spring(或任何 JCache 实现者)自动创建具有默认名称的缓存(如果没有找到)?

    cache2k 涵盖了此问题。如果请求的缓存名称未知,您可以将 cache2k 配置为使用默认配置。

    这是此场景的示例 XML 配置,位于类路径中的 /cache2k.xml

    <cache2k xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
             xmlns='https://cache2k.org/schema/v1.x'
             xsi:schemaLocation="https://cache2k.org/schema/v1.x https://cache2k.org/schema/cache2k-core-v1.x.xsd">
      <version>1.0</version>
      <ignoreMissingCacheConfiguration>true</ignoreMissingCacheConfiguration>
      <defaults>
        <!-- default settings for every cache -->
        <cache>
          <entryCapacity>100_000</entryCapacity>
          <expireAfterWrite>5m</expireAfterWrite>
        </cache>
      </defaults>
      <templates>
        <cache>
          <name>shortExpiry</name>
          <expireAfterWrite>5m</expireAfterWrite>
        </cache>
        <cache>
          <name>lessResilient</name>
          <resilienceDuration>1m</resilienceDuration>
        </cache>
      </templates>
      <caches>
        <cache>
          <name>products</name>
          <entryCapacity>10_000</entryCapacity>
          <include>shortExpiry,lessResilient</include>
        </cache>
        <cache>
          <name>users</name>
          <entryCapacity>1000</entryCapacity>
          <include>shortExpiry</include>
        </cache>
      </caches>
    </cache2k>
    

    默认情况下,根据此配置,没有特定配置条目的缓存将获得 100K 条目限制和 5 分钟到期。该配置可能适用于生产中的路径。稍后,您或系统操作员可以通过 JMX 检查存在哪些缓存及其性能,然后在需要时添加更具体的缓存配置。如果你有很多缓存,配置有一个模板机制来避免重复。

    缓存可能需要预先进行特定配置,而有些则不需要。我建议将它们分成不同的缓存管理器。

    如果您需要进程内缓存,cache2k 是 EHCache 的一个很好的替代方案。它速度更快,内存效率更高。

    您可以通过 JCache 使用 cache2k,但也有直接的 Spring 框架支持。详情请见User Guide Spring Framework Section

    我是 cache2k 的作者,目前还不是 Spring 的重度用户,但是,如果有任何问题,我很乐意提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多