如何在多个集群中访问具有相同名称的Coherence缓存

本文关键字:缓存 Coherence 访问 | 更新日期: 2023-09-27 18:28:43

我有几个Oracle Coherence集群,在每个集群上我都有一组具有相同缓存名称的相同缓存。如何从应用程序中的每个集群访问单个缓存(如"Cache1")?例如,我可能想检查所有环境中显示给用户的"Cache1"的计数。

集群是使用Coherence Extend设置的,我已经为每个集群设置了具有单独缓存映射和远程缓存方案的客户端缓存配置。但是,如果我为每个集群将缓存名称元素设置为"Cache1",它只会从xml中列出的第一个集群中检索数据。如果我将其设置为其他值(例如"Cache1-Dev1"),我会得到一个Tangosol.IO.Pof.PortalException,并显示消息"No scheme for cache:"Cache1-Dev1"。

<cache-config xmlns="http://schemas.tangosol.com/cache">
  <caching-scheme-mapping>
    <cache-mapping>
      <cache-name>Cache1-Dev1</cache-name>
      <scheme-name>extend-direct-dev1</scheme-name>
    </cache-mapping>
    <cache-mapping>
      <cache-name>Cache1-Dev2</cache-name>
      <scheme-name>extend-direct-dev2</scheme-name>
    </cache-mapping>
  </cache-scheme-mapping>
<caching-schemes>
<remote-cache-scheme>
  <scheme-name>extend-direct-dev1</scheme-name>
  <service-name>ExtendTcpCacheService-dev1</service-name>
  <initiator-config>
    <tcp-initiator>
      <remote-addresses>
        <socket-address>
          <address>dev1-address</address>
          <port>9500</port>
        </socket-address>
      </remote-addresses>
    </tcp-initiator>
    <outgoing-message-handler>
      <request-timeout>60s</request-timeout>
    </outgoing-message-handler>
  </initiator-config>
</remote-cache-scheme>
<remote-cache-scheme>
  <scheme-name>extend-direct-dev2</scheme-name>
  <service-name>ExtendTcpCacheService-dev2</service-name>
  <initiator-config>
    <tcp-initiator>
      <remote-addresses>
        <socket-address>
          <address>dev2-address</address>
          <port>9500</port>
        </socket-address>
      </remote-addresses>
    </tcp-initiator>
    <outgoing-message-handler>
      <request-timeout>60s</request-timeout>
    </outgoing-message-handler>
  </initiator-config>
</remote-cache-scheme>
</cache-config>

如何在多个集群中访问具有相同名称的Coherence缓存

在其他地方找到了答案。

首先,获取代理服务实例,并将其强制转换为CacheService。然后,您应该能够从该服务实例中获取缓存。

Java实现:

Service service = CacheFactory.getService("ExtendTcpCacheService-dev1");
CacheService cacheService = (CacheService) service;
NamedCache cache = cacheService.ensureCache("Cache1");

C#中的代码几乎相同:

var service = CacheFactory.GetService("ExtendTcpCacheService-dev1");
var cacheService = (ICacheService)service;
var cache = cacheService.EnsureCache("Cache1");

这也意味着您不再需要在缓存配置xml文件的缓存映射部分列出缓存,尽管您至少需要一个包含缓存名称和方案名称的缓存映射才能运行一致性,即使它没有使用。