1

クラスターで実行する場合、または同じドメインを使用する複数の JVM で cayenne を最適に構成する方法に関するリソースを探しています。私はドキュメントを読んでいて、これを見ています:

「オブジェクトの変更について他のスタックに通知する方法があります。これはモデラーで設定できます。ただし、すべての変更を完全に同期すると、過剰なネットワーク トラフィックと CPU 消費が発生することが多く、通常は説明されているクエリ キャッシュ アプローチを優先して回避されます。この章の他の場所で。」

これは、Query-Result-Caching ページにリンクしています。関連付けられたオブジェクトがゲッターを介して取得されるとき、またはオブジェクトがその ID によって取得されるときに、オブジェクトのキャッシュが使用されることは私の理解です。この引用は、クエリ キャッシュを構成するとオブジェクト キャッシュが使用されないことを示しているのでしょうか? それとも、アプリケーション コードのオブジェクト キャッシュにヒットすることを避ける必要があるのでしょうか? オブジェクト キャッシュを完全に無効にする必要がありますか (それが可能な場合でも)? オブジェクト キャッシュへの変更を他のスタックに通知するように cayenne を設定しない場合、データが古くなるリスクはありませんか?

複数のノードで cayenne を実行するための最善の方法に関するあらゆるヒントに感謝します。または、参考になるリソースがあれば、それも非常に役立ちます。

お時間をいただきありがとうございます。

4

1 に答える 1

1

オブジェクト キャッシュとクエリ キャッシュは互いに独立していますが、互いの状態に影響を与える可能性があります。

オブジェクトキャッシュ

オブジェクト キャッシュは、オブジェクト グラフを展開するときにアクセスされます (正しくお気づきのとおり)。ただし、オブジェクト キャッシュの同期は、キャッシュを更新するだけでなく、ObjectContexts にも伝達され、メモリ内のオブジェクト グラフが更新されます。これはすばらしく超自動に聞こえますが、経験上、1 人のユーザーに関連するオブジェクトのグラフが限られているデスクトップ アプリで最も役立ちます。クラスター化されたマルチユーザー Web アプリケーションでは、オブジェクト キャッシュを同期することは、役立つというよりは面倒です。大量のネットワーク トラフィックが発生し、インスタンスがあまり気にしないイベントを処理するために CPU を消費するように強制され、最後に、予期しないときにオブジェクトを下から更新します。そのため、私は通常、オブジェクト キャッシュの同期をオフにし、クラスター化されたクエリ キャッシュのみに依存して同期を処理します。

クエリ キャッシュ

これは、クラスタリングを使用したクエリ キャッシュを示すサンプル プロジェクトです。Cayenne 4.0、EHCache をキャッシュ プロバイダーとして使用し、ActiveMQ/JMS をインスタンス間イベントに使用します。

クエリ キャッシュの仕組みでは、特定のクエリに一致したオブジェクトのリストがキャッシュされます。クエリにプリフェッチが含まれている場合は、プリフェッチされた関連オブジェクトも含まれます。クエリ キャッシュを最大限に活用するには、コーディング スタイルを少し変更する必要がある場合があります。クエリ結果リストへの長期間有効な参照をインスタンス変数に格納する (基本的に独自のキャッシュを行う) 代わりに、そのようなリストが必要なときにいつでもクエリを作成して実行し (適切なキャッシュ設定で)、リストが必要かどうかを Cayenne に決定させます。キャッシュから返されるか、DB から新たにフェッチされます。

次のステップは、デフォルトの有効期限ポリシーを (キャッシュ グループごとに) 指定するために使用しているプロバイダーに応じて、キャッシュを構成することです。たとえば、サンプル EHCache config

最後に、クラスタリングとイベント ドリブンのキャッシュ更新を追加できます。これは、API 呼び出しを介して明示的に、または特定のエンティティのコミット時に暗黙的に実行できます (Cayenne 3.1 以降でのみ利用可能)。

クエリ キャッシュの更新は非常に安価です。ネットワークを介して送信されるのは「キャッシュ グループ」の名前だけであり、受信側では一連のリストが遅延して一度に無効化されます。また、コードがよりクリーンになります。

主にクエリ キャッシュに依存する場合は、オブジェクト キャッシュ自体を「オフ」にする必要はありません。オブジェクト キャッシュは Cayenne の不可欠な部分であり、多くの操作 (更新、関係の処理) に必要です。クエリを実行すると、自動的に更新されます。ただし、通常行う必要があるのは、オブジェクトの自動更新をオフにすることです。オブジェクト キャッシュ クラスタリングを有効にしないことで、クロス JVM 同期を回避できます。さらに、このアドバイスを使用して、同じ VM 内のクロス ObjectContext 同期を無効にすることもできます。

カイエンのバージョン

少なくとも Cayenne 3.1 (または 4.0.M2) にアップグレードすることを強くお勧めします。他の優れた機能の中でも特に、キャッシング メカニズムは 3.0 よりも成熟しています。これにより、Cayenne の構成と外部キャッシュ プロバイダーの統合が非常に簡単になります。

于 2015-12-13T10:41:49.980 に答える