Oracle Coherence驱逐无效

时间:2016-05-09 21:17:47

标签: java caching oracle-coherence

我正致力于实施Oracle Coherence复制缓存。实施如下:

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">

<cache-config>

  <caching-scheme-mapping>
    <cache-mapping>
      <cache-name>EntryList</cache-name>
      <scheme-name>ENTRY_ITEMS</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>

  <caching-schemes>
    <replicated-scheme>
      <scheme-name>ENTRY_ITEMS</scheme-name>
      <backing-map-scheme>
        <local-scheme>
          <scheme-name>ENTRY_ITEMS</scheme-name>
          <unit-calculator>FIXED</unit-calculator>
          <expiry-delay>60m</expiry-delay> <!-- expire after 60 minutes -->
          <high-units>2000</high-units>
          <eviction-policy>LFU</eviction-policy>
        </local-scheme>
      </backing-map-scheme>
      <autostart>true</autostart>
    </replicated-scheme>
  </caching-schemes>
</cache-config>

tangasol相干-Override.xml的

<coherence xmlns:xsi="http://www.w4.org/2001/XMLSchema-instance"
  xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
  xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config 
         coherence-operational-config.xsd">

  <cluster-config>
    <member-identity>
      <cluster-name>clusterName</cluster-name>
      <!-- Name of the first member of the cluster -->
      <role-name>RoleName</role-name>
    </member-identity>
    <unicast-listener xml-override=coherence-environment.xml/>
  </cluster-config>

</coherence>

相干-environment.xml

<unicast-listener xmlns:xsi="http://www.w4.org/2001/XMLSchema-instance"
  xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
  xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config 
         coherence-operational-config.xsd">

  <well-known-addresses>
    <socket-address id="1">
      <address>member1</address>
      <port>7777</port>
    </socket-address>
  </well-known-addresses>

  <well-known-addresses>
    <socket-address id="2">
      <address>member2</address>
      <port>7777</port>
    </socket-address>
  </well-known-addresses>
</unicast-listener>

这已经过实施和测试,可以完美运行。

我们正在测试缓存的驱逐政策。为了简化测试,我做了以下工作:

  1. 我将 高单位 设置为4,将缓存大小保持为4.现在在缓存中添加4个条目。这应该完全填满缓存。
  2. 现在,如果我在缓存中再输入一个5号条目,我希望将租用的常用条目从缓存中踢出,为条目号5腾出空间。
  3. 下次我访问新条目号5的缓存时,我应该得到一个缓存HIT。
  4. 但是没有发生,我总是得到一个Cache MISS。
  5. 我在调试模式下运行了我的java代码,我看到代码PUT在缓存中的条目号为5,但是这个PUT操作没有反映在缓存上。
  6. 现在我绝对不是第一个测试一致性缓存驱逐策略的人。我错过了配置中的任何内容吗?我是以错误的方式测试驱逐的吗?欢迎提出任何意见。

    感谢。

2 个答案:

答案 0 :(得分:0)

尝试隔离问题:

  • 更改<expiry-delay>1</expiry-delay>(1ms)
  • 添加<low-units>0</low-units>(默认值为75%,即3个条目)。
  • 尝试其他政策<eviction-policy>LRU</eviction-policy>

如果这些措施无效,请尝试添加自定义驱逐政策类,以查看触发的驱逐行为。见here

答案 1 :(得分:0)

我尝试过以3为高单位的例子。我的观察:

  • 一旦我放入第4个项目,驱逐就会起作用。所以,它有效!!
  • 您可以启动Coherence Server(coherence.sh)进行命令行监控,同时覆盖&amp;缓存配置文件。查看详细信息,当我按下以下命令查看缓存时会打印出来:
  

映射(?):缓存EntryList

Cache Configuration: EntryList
  SchemeName: ENTRY_ITEMS
  AutoStart: true
  ServiceName: ReplicatedCache
  ServiceDependencies
    EventDispatcherThreadPriority: 10
    ThreadPriority: 10
    WorkerThreadsMax: 2147483647
    WorkerPriority: 5
    EnsureCacheTimeout: 30000
  BackingMapScheme
    InnerScheme (LocalScheme) 
      SchemeName: ENTRY_ITEMS
      UnitCalculatorBuilder
        Calculator: FIXED
      EvictionPolicyBuilder
        Policy: LFU
      ExpiryDelay: 1h
      HighUnits
        Units: 3
      UnitFactor: 1