奇妙な問題が発生しています。Oracle CoherenceキャッシュのKeySetを取得しますが、更新アクティビティがない場合でも、キャッシュから値を直接取得することはできません。
次のコードは一貫して失敗します(つまり、オブジェクトが取得されないため、「>>>> 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);
}
}
キャッシュは、複数のインデックスを持つパーティション化された名前付きキャッシュです。
キーは、1つのインスタンス変数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;
}
Coherenceは、この構成でシリアル化されたキーオブジェクトのハッシュを使用していると思います。これにより、フロントキャッシュ(ローカルJVM、ローカルストレージがオフになっている)とバックキャッシュ(ストレージ)の両方に当てはまるかどうかわからない場合を除いて、これら2つの方法は無関係になります。ノードJVMの)。
一部のコードは、キーを再構築し、値を標準の順序で挿入することで、この問題を部分的に解決します。これは通常は機能します。hashCode()メソッドとHashMap用のJavaのhashCode()は、AFAIKであり、ハッシュの反復順序に影響されないため、これが必要な理由はわかりません。なぜそれが通常は機能するが、常に機能するとは限らないのかも謎です。