3

Oracle Coherence 3.5 L1/L2 キャッシングを多用するマルチスレッド アプリケーション (1 秒あたり 1,000 リクエスト) があり、パフォーマンスが重要です...

  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 に答える