跨线程的Oracle Coherence CacheFactory.getCache()用法

时间:2012-12-03 23:55:17

标签: oracle-coherence

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

  1. 我是否需要同步CacheFactory.getCache()的访问权限?

  2. 我应该为后续请求重复使用NamedCache结果吗?

  3. 目前正在执行以下操作以最小化对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);
    }
    

1 个答案:

答案 0 :(得分:2)

经过一些性能测试后......似乎重用NamedCache确实证明速度稍微快一点,所以这里是我最终的结果......删除了synchronized,使用了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;
}