(コンテキスト) データベースから情報をロードしてアプリケーションで利用できるようにするキャッシュを構築する必要があります。このデータは、このアプリケーションでは変更されず、多くのスレッドによって頻繁に使用 (取得) されます。データは (まれに) 別のアプリから変更される場合があります。1時間ごとに更新するだけで十分です。リードスルー キャッシュを作成する Ehcache が適していると思います。
次のようなキャッシュについて考えました。
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, ResourcePoolsBuilder.heap(100))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofHours(1)))
.withLoaderWriter(new CacheDataProvider())).build();
cacheManager.init();
Cache<Integer, String> myCache = cacheManager.getCache("preConfigured", Integer.class, String.class);
キャッシュが (1 時間後に) 期限切れになり、スレッドがキー 1 のエントリを要求し、その直後に別のスレッドが同じエントリ 1 を要求したとします。最初のスレッドがエントリ 1 を要求すると、キャッシュは期限切れであることを確認し、LoaderWriter に要求します。エントリ 1 をロードします。
私の質問は次のとおりです。LoaderWriter が最初のリクエストでエントリ 1 をロードしている間、キャッシュはエントリ 1 がロードされるまで 2 番目のスレッドを「待機」させますか、それとも 2 番目のリクエストがエントリ 1 の (ほぼ) 同時ロードをトリガーする可能性がありますか? つまり、同じエントリが LoaderWriter から 2 回読み込まれるということですか?