2012-02-17 8 views
3

奇妙な問題が発生しています。 Oracle CoherenceキャッシュのKeySetが取得されますが、更新アクティビティがない場合でも、キャッシュから値を直接取得することはできません。取得したキー・オブジェクトでOracleの一貫性が失われる可能性はありますか?

次のコードは一貫して失敗します(つまり、オブジェクトが取得されないため ">>>> NULL"を出力します)。問題は、なぜですか?

キャッシュは、複数のインデックスを持つパーティション名付きキャッシュです。

キーは、1つのインスタンス変数HashMapを持つオブジェクト(図示せず)です。

次のようにキーオブジェクトが等しい()と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; 
} 

Iコヒーレンスは、これら2つの方法は無関係レンダリングになる。この構成でシリアライズキーオブジェクトのハッシュを使用すると信じて、フロントキャッシュ(ローカルJVM、ローカルストレージはオフ)とバックキャッシュ(ストレージノードJVM)の両方に当てはまることは分かりません。

一部のコードでは、キーを再構築して標準的な順序で値を挿入することで、この問題を部分的に解決しています。このは通常です。私たちのhashCode()メソッドとHashMapのJavaのhashCode()はAFAIKであり、ハッシュの反復順序に影響されないので、なぜこれが必要なのか分かりません。それは通常、しかし常に作品ではありませんなぜ謎でもあります。

答えて

2

答え(おかげで、ディミトリは)HashMapのは、直列化順序を保証するものではないということですので、シリアル化されたハッシュ - > deserialize->オブジェクトのハッシュ - > serialize->シリアル化されたハッシュは、2番目のシリアライズされたハッシュが最初のシリアライズされたハッシュと異なるバイトストリームになる可能性があります。

Javaはハッシュでの順序付けを保証していないため、シリアル化は順序に依存します。シリアライゼーションは、1つのJVMと別のもの、さらには同じJVM内であっても異なる場合があります。ハッシュマップの内部実装は、N個のバケットを有する典型的なメモリ内ハッシュであるので、各エントリのハッシュバケットに対応する一組の(おそらくリンクリストを介して)保持する、エントリがハッシュに投入される順序を決定します(指定されていない方法で)キーセット反復がそれらを返す順序を指定します。 TreeMapのは、比較することにより、一貫性のある順序ので、おそらく、一貫したシリアライズを生成する必要があります。

Coherenceでパーティション化されたキャッシュは、キーと値をのシリアル化形式で格納するため、シリアル化されたバージョンのキーでハッシュ関数を計算し、シリアライズされたキーで等価チェックを行います。シリアライズされたストリームは、オブジェクトの再構築の目的では同等ですが、ハッシュおよび等価性検査操作で必要とされるものと同一の保証はありません。

近いキャッシュに、オブジェクトはデシリアライズ形式で保持され、したがってその等しい(さらに問題を複雑に)ハッシュコード()方法が代わりに使用されています。

最後に、コヒーレンスは、通常低下シリアライズ大きさになると、シリアル化されたオブジェクトにシリアル化の直接制御を提供し、それらの独自のPOFシリアライゼーションの使用を推奨しています。

+0

その後の追加/削除操作の後にツリーの内部構造が一貫している、つまりキー{1,2}を持つツリーが1または2を含むルートノードを持つ可能性があるので、TreeMapは良い例だとは思わない以前のツリーの操作によって異なります。 – javaPhobic

関連する問題