我认为terracotta bigmemory可以很容易地解决数据一致性问题,但是当我阅读其文档时,它在ehcache.xml和源代码中都需要几个参数/属性。
我的ehcache.xml是:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
name="config">
<cache name="bigMemory"
maxBytesLocalHeap="128M"
copyOnRead="true"
copyOnWrite="true"
eternal="true">
<terracotta consistency="strong" />
</cache>
<terracottaConfig url="localhost:9510" rejoin="false"/>
</ehcache>
读取和增加共享数据现有值的代码片段为:
for (int i = 0; i < 1000; i++) {
transactionController.begin();
bigMemoryChip.put(new Element(uid, ((Long) bigMemoryChip.get(uid).getObjectValue())+1));
transactionController.commit();
}
我所做的是执行两次代码并观察它如何处理一致性,通常我的预期是最终值2000比初始值多。
虽然我尝试了大约15次,但只有一次超过初始值2000次,但其他所有人都比初始值多了1500-1700次。
答案 0 :(得分:0)
不知道你的transactionController
是什么,但除非它是一个提供排除的集群数据结构,否则你正在执行的操作是非原子,因此你会看到put
之间的竞争1}}和get
。
这个节点上的put
和get
之间的另一个节点上可能会发生put
,最终隐藏增量。
当您使用强一致性时,如果更改条件put
中的replace
,测试将通过。