私の同僚と私は、2 番目のレベルのキャッシュにキャッシュされたコレクションが古いデータを返す可能性がある場合 (if?) について議論してきました (私たちは ehcache と hibernate 3.2.4 を使用しています)。
シナリオは次のとおりです。
- 親オブジェクト P はキャッシュされ、エンティティです。
- 親には、キャッシュされて怠惰な子のコレクション (バッグ) があります。
- 子オブジェクト C はキャッシュされ、エンティティです。
- これらすべてのキャッシュ同時実行戦略として、Nonstrict read-write を使用しています。
- 私たちのセッション ファクトリはプロセス スコープであり、関与する JVM は 1 つだけです。
- 上記のすべてのキャッシュのキャッシュ領域は、すべての子と親のすべてのインスタンスをメモリ内に簡単に保持するのに十分な大きさであると想定します。
時間 T1: すべての C1...CN が読み込まれるように、session.load(p) を実行し、子コレクションを反復処理することによって、親 P と子 C1...CN を読み込みます。
時間 T2: 別のセッションが C1 をロードし、C1 を更新してデータの一部を変更します。
P.getChildren().get(0) を呼び出すと、C1 の古いバージョン (時間 T1 にロードされた C1 のバージョン) が返されるのはどのような状況ですか?
私は2つあると考えています:
- T1 の操作と同じ休止状態セッションにいる場合 (この場合、セッション キャッシュ バージョンが返されます)
- 非厳密な読み取り/書き込みでは、T2 での更新とロードがほぼ同時に発生し、ロードが競合に勝ち、キャッシュから古いオブジェクトを取得するという競合状態が発生する可能性があります。(その場合、読み書きに変更でき、問題ありません)