【发布时间】:2021-07-11 20:19:22
【问题描述】:
我到处寻找解决此问题的方法,但找不到任何提示。
我的应用程序部署在 JBOSS EAP 6.4 上并使用 JDK 1.8 构建。我在独立 xml 中配置了一个本地 infinispan 缓存:
<subsystem xmlns="urn:jboss:domain:infinispan:1.5">
<cache-container name="test-cache" default-cache="test-data-cache" jndi-name="java:jboss/infinispan/test-cache" statistics-enabled="true">
<transport lock-timeout="60000"/>
<local-cache name="test-data-cache" statistics-enabled="true">
<!-- <transaction locking="PESSIMISTIC"/> -->
<locking isolation="READ_COMMITTED"/>
<expiration lifespan="3600000"/>
</local-cache>
</cache-container>
</subsystem>
我将数据放入缓存中:
package com.comp.test;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.apache.commons.collections4.MapUtils;
import org.infinispan.Cache;
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class CacheTest {
@Resource(lookup = "java:jboss/infinispan/test-cache")
private org.infinispan.manager.CacheContainer container;
public void putData(String k, String v) {
final Map<String, String> tmap = getDataCache().get(k);
if (!containsData(k)) {
final HashMap<String, String> rmap = new HashMap<>();
rmap.put(k+"_"+v, v);
getDataCache().put(k, rmap);
} else {
getDataCache().get(k).put(k+"_"+v, v);
}
}
public boolean containsData(String k) {
return getDataCache().containsKey(k);
}
private Cache<String, Map<String, String>> getDataCache() {
return container.getCache("test-data-cache");
}
}
我有无状态 bean,可以同时将数据集合放入缓存中(@Asyncronous 注释)。当所有并发操作结束后我从缓存中检索数据时,缓存总是具有较少数量的值。如果我放 20 个值,缓存中只有 16 / 17 个值。
我试图确定是否可以在将数据加注到该特定键的缓存中之前锁定该键。但我了解到它是由 Infinispan 内部处理的。我在 SO 上发现了另一个类似的问题。但这个问题也没有答案。 Infinispan cache inconsistency for massive concurrent operations
请告诉我如何确保同时放入 infinispan 本地缓存的数据最后是一致的。如果您需要更多信息,请告诉我。
【问题讨论】:
标签: java concurrency jboss jboss6.x infinispan