オブジェクト キャッシュとクエリ キャッシュは互いに独立していますが、互いの状態に影響を与える可能性があります。
オブジェクトキャッシュ
オブジェクト キャッシュは、オブジェクト グラフを展開するときにアクセスされます (正しくお気づきのとおり)。ただし、オブジェクト キャッシュの同期は、キャッシュを更新するだけでなく、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 の構成と外部キャッシュ プロバイダーの統合が非常に簡単になります。