infinispan中的javax.cache.annotation.CacheResult是否需要方法中的参数

Does javax.cache.annotation.CacheResult in infinispan need parameters in the method

美好的一天, 我现在对 infinispan 的 JBoss 企业应用平台 6.1 和 6.3 中的 javax.cache.annotation.CacheResult 实现有点困惑。

我一直在谷歌搜索并浏览 Whosebug,但对于一直让我忙碌的问题,我还没有真正找到明确的答案。所以我走了。 @CacheResult 注释是否需要其注释的方法中的参数。它使用参数实际创建商店的密钥。然而,它并没有真正记录如果你没有它会发生什么。对于想要 return 存储在数据库中的国家/地区列表并且该列表不会经常更改的 Web 应用程序,可能会发生这种情况。

代码示例:

/**
 * Fetches a list of Country's from the Database system trough the SOAP adapter.
 *
 * @return a lit of country's from the Database system.
 */
@CacheResult(cacheName = "referenceService/CountryListCache")
// The attributes sorted is used by the caching mechanism, as combined key for the (to be) cached CountryListCache object.
public List<Country> getCountryList() throws ReferenceServiceException_Exception {
    LOG.debug("Cache is not used doing a full call to the service.");
    ReferenceTableIdSO getter = //Create a getter that does the external query;

    List<AlfaCodeDBObjectSO> transform = //calls the external system to get the data.
    //Transform the external data to somtine we want to return.
    List<Country> result = new ArrayList<Country>();
    for (AlfaCodeDBObjectSO trans : transform) {
        Country country = new Country(trans.getCode(), trans.getExplanation());
        result.add(country);
    }

    return result;
}

EAP6.1.1配置

    <subsystem xmlns="urn:jboss:domain:infinispan:1.4">
        <cache-container name="rest-cache" default-cache="default" start="EAGER"> 
            <local-cache name="default">  
                <transaction mode="NONE"/>
                <eviction strategy="LRU" max-entries="1000"/>
                <expiration max-idle="3600000"/>
            </local-cache>
            <local-cache name="referenceService/CountryListCache">  
                <locking isolation="REPEATABLE_READ" acquire-timeout="15000"/>
                <transaction mode="NONE" locking="PESSIMISTIC"/>
                <eviction strategy="LRU" max-entries="1024"/>
                <expiration lifespan="86400000"/>
            </local-cache>
        </cache-container>
    </subsystem>

如您在我的示例中所见,我想减少代码调用。为了确定,我将配置设置为每天刷新一次。但我实际上不确定列表是否被缓存等。因为关于该方法是否没有参数的记录太少了。

根据the specification for JSR-107,如果未指定cacheName@CacheResult

  • 在 class 的 @CacheDefaults 注释中寻找 cacheName 属性。正如您可以从名称中推断的那样,此注释在 class 中设置与缓存相关的注释的默认值。如果不设置这个注解,则

  • 使用模板 package.name.ClassName.methodName(package.ParameterType,package.ParameterType)

  • 自动生成 cacheName

编辑: 我之前看错了你的问题。关于无参数方法的密钥生成,虽然规范没有直接说明,但可以从以下观点推断不支持

  • Infinispan 对 0DefaultCacheKey(the wrapper class for the key in the cache) shows that a no-arg method will result in a deepHashCode 的实现,用于方法的每次调用。因此,您的缓存将只包含一个值,其键为 0

  • JSR中的getAnnotations()方法有如下注释:

    @return An immutable Set of all Annotations on this method parameter,never null.

    这表明(无论如何对我而言)缓存方法不会有参数。


您可能想重新评估您的设计:我想不出为什么应该缓存无参数方法调用的原因。对于无参数方法,我可以想到两个用例

  • 方法的每次调用 return 都是每次调用的唯一值,在这种情况下,您 不想 添加缓存组件的那个级别,但是对于父方法来说,因为缓存在第一次调用后不会使用的唯一值没有价值

  • 方法的每次调用 return 都是相同的值,在这种情况下,调用方法一次(可能在启动时)并存储 return 可能更干净值,在申请期间使用