1

美好的一天,我现在对 infinispan javax.cache.annotation.CacheResultJBoss Enterprise Application Platform 6.1 和 6.3中的实现有点困惑。

我一直在谷歌搜索并浏览stackoverflow,但对于一直让我忙碌的问题,我还没有真正找到明确的答案。所以我走了。注释是否@CacheResult需要其注释的方法中的参数。它使用参数实际为商店创建密钥。然而,它并没有真正记录如果你没有它会发生什么。对于想要返回存储在数据库中的国家/地区列表并且该列表不会经常更改的 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>

正如您在我的示例中看到的,我想减少代码调用。我将配置设置为每天刷新一次,以确保安全。但我实际上不确定该列表是否已缓存等。因为关于该方法是否没有参数的文档记录太差。

4

1 回答 1

1

根据JSR-107 的规范,如果cacheName没有指定,@CacheResult

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

  • 使用cacheName模板自动生成package.name.ClassName.methodName(package.ParameterType,package.ParameterType)

编辑:我之前误读了你的问题。关于没有参数的方法的密钥生成,虽然规范没有直接解决它,但可以从以下角度推断它不支持

  • Infinispan 的(缓存中键的包装类)的实现表明,对于该方法的每次调用,DefaultCacheKey无参数方法将导致 a deepHashCodeof 。0结果,您的缓存将只包含一个值,其键为0

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

    @return此方法参数上所有注释的不可变集,从不为空。

    这表明(无论如何对我来说)没有期望缓存方法没有参数。


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

  • 该方法的每次调用都会为每个调用返回一个唯一值,在这种情况下,您不想将缓存添加到组件的该级别,而是添加到父方法,因为缓存不会被缓存的唯一值没有任何价值在第一次调用后使用

  • 该方法的每次调用都返回相同的值,在这种情况下,调用该方法一次(可能在启动时)并存储返回值可能更干净,以便在应用程序期间使用

于 2015-04-26T19:11:38.613 回答