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 对 0
的 DefaultCacheKey
(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 可能更干净值,在申请期间使用
美好的一天,
我现在对 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 对
0
的DefaultCacheKey
(the wrapper class for the key in the cache) shows that a no-arg method will result in adeepHashCode
的实现,用于方法的每次调用。因此,您的缓存将只包含一个值,其键为0
JSR中的
getAnnotations()
方法有如下注释:@return
An immutable Set of all Annotations on this method parameter,never null.这表明(无论如何对我而言)缓存方法不会有参数。
您可能想重新评估您的设计:我想不出为什么应该缓存无参数方法调用的原因。对于无参数方法,我可以想到两个用例
方法的每次调用 return 都是每次调用的唯一值,在这种情况下,您 不想 添加缓存组件的那个级别,但是对于父方法来说,因为缓存在第一次调用后不会使用的唯一值没有价值
方法的每次调用 return 都是相同的值,在这种情况下,调用方法一次(可能在启动时)并存储 return 可能更干净值,在申请期间使用