我们有一个多线程应用程序,它使用Oracle Coherence 3.5 L1 / L2缓存(1k请求/秒),性能至关重要......
我是否需要同步CacheFactory.getCache()
的访问权限?
我应该为后续请求重复使用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);
}
答案 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;
}