我认为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次。
发布于 2016-04-26 00:50:52
我不知道您的transactionController是什么,但是除非它是提供排除的集群数据结构,否则您正在执行的操作不是原子的,因此您可以看到put和get之间的竞争。
也就是说,在此节点上的get和put之间的另一个节点上可能会发生put,这将最终隐藏增量。
由于您使用的是强一致性,因此如果您在条件replace中更改put,则测试将通过。
https://stackoverflow.com/questions/36843288
复制相似问题