我們遇到了一個奇怪的問題。我們獲得Oracle Coherence緩存的KeySet,但不能直接從緩存中獲取值,即使沒有更新活動。如何通過檢索到的關鍵對象使oracle一致性失敗?
以下代碼一致失敗(即輸出「>>>> NULL」,因爲未檢索到該對象)。問題是:爲什麼?
NamedCache nc = CacheFactory.getCache(cacheName);
Set<Object> keys = (Set<Object>)nc.keySet();
for (Object key : keys) {
Object o = nc.get(key);
if (o == null) {
System.out.println(">>>>NULL:"+keyStr);
}
}
該緩存是一個具有多個索引的分區命名緩存。
關鍵是帶有一個實例變量HashMap的對象(未顯示)。
的關鍵對象也有equals()和hashCode()方法如下:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((values == null) ? 0 : values.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("EQUALS");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AbstractCacheKey other = (AbstractCacheKey) obj;
if (values == null) {
if (other.values != null)
return false;
} else if (!values.equals(other.values))
return false;
return true;
}
相信連貫使用該配置中的序列化的關鍵對象,這將使這兩種方法不相干的哈希值,除了我不知道前端緩存(本地JVM,本地存儲關閉)和後端緩存(存儲節點JVM)都是如此。
我們的部分代碼通過重建鍵,以標準順序插入值來部分解決此問題。這通常的作品。我不明白爲什麼這是必要的,因爲我們的hashCode()方法和HashMap的Java的hashCode()AFAIK對散列的迭代順序不敏感。爲什麼它通常,但不總是作品也是一個謎。
我不認爲TreeMap是一個很好的例子,因爲在後續的添加/刪除操作之後,不能保證樹的內部結構是一致的,即具有鍵{1,2}的樹可以具有包含1或2的根節點,這取決於樹上以前的操作。 – javaPhobic 2013-10-02 01:43:34