11

マークされたメソッド@Cacheableが完了するまでに 10 分かかり、2 つのスレッド t1、t2 がメソッドにアクセスする場合。

t1 は時刻 0 にアクセスします (キャッシュ メソッドが初めて実行されます) t2 は時刻 t1+5mins にアクセスします

@Cacheableこれは、t1 が既に操作を開始しており、5 分以内に完了する予定であるため (5 分間実行されているため) 、t2 が約 5 分間データにアクセスしないことを意味しますか、それとも新しい呼び出し@Cacheableが t2 によって呼び出されるのでしょうか?

4

4 に答える 4

7

最初の実行の結果がキャッシュされていない場合、2 番目の呼び出しが続行されます。

@Cacheableこれは、キャッシュのコンテンツを中心にしていることを理解する必要があります(具体的にはスレッドの実行コンテキストではありません [まあ、キャッシュはスレッドセーフである必要があります])。メソッドの実行時に、最初にキーが存在するかどうかを確認するためにキャッシュがチェックされます。t1 が完了するまでに時間がかかる場合、その結果はキャッシュされないため、同時実行は t1 の実行に関係なく続行されます。

于 2014-11-12T17:38:19.987 に答える
4

Spring 4.3以降、 sync = true フラグを追加することで、目的のブロッキング動作を取得できます。

@Cacheable(value="cacheName", key="{#keyField1, #keyField2}", sync = true)
于 2019-11-25T10:52:55.063 に答える