6

しばらくの間、Hibernate の第 2 レベルのキャッシュとして Hazelcast を使用していますが、複数のノードを使用すると、データの保存と読み取りに長い遅延が生じることを認識しています。

構成されたオブジェクトと @OneToMany 関係を集中的に使用し、パフォーマンスを向上させるために、これらの構成されたオブジェクトまたはコレクションを Hibernate 遅延読み込みを介してロードすることにしました。また、Hazelcast のドキュメントに記載されているように、Hazelcast のシリアル化を高速化するために DataSerializable を実装しました。しかし、writeData/readData メソッドの使用をログに記録すると、実際には使用されていないことがわかりました。

Hibernate Proxy (遅延読み込みを介して使用される) が DataSerializable メソッドの使用を妨げているかどうか (プロキシ自体が (?) インターフェースを実装していない可能性があるため)、さらに重要なことに、Hazelcast が遅延読み込みをサポートしているかどうかは不明です。まったく-そしてどうやって!

4

1 に答える 1

5

Hazalcast クラスターに格納されているオブジェクトはエンティティ オブジェクトではないため、Hazelcast の DataSerializable は Hibernate L2 キャッシュでは使用できません。Hibernate は L2 で独自のデータ (シリアル化など) 形式を使用し、エンティティとその関係およびコレクションを独自の形式に変換し、独自のオブジェクト (java.io.Serializable を実装) を Hazelcast に提供します。Hazelcast は、標準の Java シリアル化を使用してそれらをシリアル化し、クラスター全体に分散します。

クラスに複雑で深いオブジェクト グラフ (構成されたオブジェクトと 1xn または類似の関係を集中的に使用) がある場合、このデュアル シリアル化の問題により長い遅延が発生します。

Hazelcast は、Hibernate の遅延読み込みとは何の関係もありません。Hibernate はすでに、エンティティとその関係、およびコレクション マッピングを個別に保存しています。したがって、これらすべてを Hazelcast から 1 つずつ読み込むことができます。しかし、あなたのユースケースでは、遅延ロード可能な関係のほとんどが常にロードされている場合、1 つではなく複数のリモート Hazelcast 呼び出しが発生します。そのため、遅延読み込みを使用する場所を慎重に検討する必要があります。

もう 1 つのトリックは、アプリがほとんど読み取り専用の場合、Hazelcast ニア キャッシュを使用/有効にすることです。(ところで、そうでない場合、L2 キャッシュの使用は適切ではない可能性があります。) そうすれば、多くのリモート呼び出しを節約でき、頻繁に必要なデータがローカルにキャッシュされます。ニア キャッシュは、TTL、エビクション、最大サイズなどのすべての Hazelcast マップ プロパティをサポートします。

Hazelcast ニアキャッシュのドキュメント...

于 2011-03-29T18:12:59.720 に答える