0

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

4

1 回答 1

0

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

也就是说,在该节点和该put节点之间的另一个节点上可能会发生事件,这最终会隐藏增量。getput

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

于 2016-04-25T16:50:51.763 回答