Oracle一致性:有没有办法强制在特定节点上调用代理?

时间:2016-11-14 17:25:56

标签: oracle-coherence

我有一个由多个节点(最多30个)组成的复制集群,其中有一个JAVA进程访问一致性缓存,我使用map.invoke(密钥,代理)方法来创建和更新代理。执行创建和更新,在过程方法中设置值。

示例(agent是实现EntryProcessor接口的ConcreteEntryProcessor的实例):

map.invoke(key, agent);

调用以下代理对象代码:

public Object process(Entry entry) {
  if (entry.isPresent())
  {
    //UPDATE
    ... some stuff which compute the new entry value...
    entry.setValue(newValue, true);
    return newValue
  }
  else
  {
    //CREATION 
    ..other stuff to determine the value...
    entry.setValue(value, true);
    return value;
  }
}

我注意到如果更新是由创建代理的节点进行的,那么我的性能会很好,否则如果更新来自不同的节点,我的性能会下降。似乎存在一种数据所有权。

有没有办法强制在本地节点上执行代理或更改数据的所有权?

1 个答案:

答案 0 :(得分:0)

这完全取决于缓存配置。如果使用分布式(分区)缓存,那么确实存在某种数据所有权。在这种情况下,在拥有给定密钥的节点上调用条目处理器。

根据您的表现问题,我看到两种可能性:

  1. map.invoke(key, agent)的效果降低,但EntryProcessor.process(entry)的效果稳定。在这种情况下,您的性​​能问题可能是由将处理结果发送回调用map.invoke(key, agent)的节点所需的序列化和网络流量引起的。如果您在该节点上不需要此值,则只需从您的条目处理器返回null

  2. EntryProcessor.process(entry)的效果下降。在这种情况下,您的创建/更新逻辑可能需要来自调用map.invoke(key, agent)的节点的一些数据。因此,这又是序列化/网络流量问题,但如果不了解特定逻辑的详细信息,很难找到解决问题的方法。