3

我们有一个多线程应用程序,它大量使用 Oracle Coherence 3.5 L1/L2 缓存(1k 请求/秒),其中性能至关重要......

  1. 我需要同步访问CacheFactory.getCache()吗?

  2. 我应该将NamedCache结果重用于后续请求吗?

目前它正在执行以下操作以最小化对 CacheFactory 的调用并同步对它的访问...

static ConcurrentHashMap<String, NamedCache> cacheMap = new ConcurrentHashMap<String, NamedCache>();
protected static NamedCache getCache(String cacheName)
{
    NamedCache cache = cacheMap.get(cacheName);
    if (cache == null)
    {
        cache = CacheFactory.getCache(cacheName);
        cacheMap.put(cacheName, cache);
    }

    return cache;
}

更新:经过一番探索之后,这似乎没有必要,因为 Coherence API 应该是线程安全的......似乎我可以简化为这个,对吗?

protected static NamedCache getCache(String cacheName)
{
    return CacheFactory.getCache(cacheName);
}
4

1 回答 1

2

经过一些性能测试......似乎重用 NamedCache 确实证明稍微快一些,所以这就是我最终的结果......删除同步,改用 putIfAbsent()

protected static NamedCache getCache(String cacheName)
{
    NamedCache cache = cacheMap.get(cacheName);
    if (cache == null)
    {
        cache = CacheFactory.getCache(cacheName);
        NamedCache existing = cacheMap.putIfAbsent(cacheName, cache);
        if (existing != null)
            return existing;
    }

    return cache;
}
于 2012-12-04T05:20:24.647 回答