Terracotta BigMemory共享数据并不一致

时间:2016-04-25 14:20:44

标签: java shared-memory terracotta ehcache-bigmemory

我认为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次。

1 个答案:

答案 0 :(得分:0)

不知道你的transactionController是什么,但除非它是一个提供排除的集群数据结构,否则你正在执行的操作是非原子,因此你会看到put之间的竞争1}}和get

这个节点上的putget之间的另一个节点上可能会发生put,最终隐藏增量。

当您使用强一致性时,如果更改条件put中的replace,测试将通过。