Эффективно ли ehcache вызывает LoaderWriter при работе с параллельными запросами? - PullRequest
0 голосов
/ 02 июня 2018

(Контекст) Мне нужно создать кеш, который загружает информацию из базы данных и делает ее доступной для приложения.Эти данные не будут изменены в этом приложении и будут интенсивно использоваться (извлекаться) многими потоками.Данные могут быть (редко) изменены из другого приложения.Обновление каждые 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-й поток запрашивает запись 1, кэш проверит, что он истек, и попросит LoaderWriter загрузить запись 1.

Мой вопрос: пока LoaderWriter загружает запись 1 для первого запроса, будет ли помещен кэшвторой поток «подождет», пока загрузится запись 1, или второй запрос может снова (почти) одновременно загрузить загрузку для записи 1.То есть в результате одна и та же запись загружается дважды из LoaderWriter?

1 Ответ

0 голосов
/ 06 июня 2018

Ehcache 3 в режиме cache в режиме блокирует весь доступ к данному ключу во время выполнения загрузчика.Это также указывает на то, что производительность загрузчика важна.

В вашем сценарии это означает, что один запрос отправляется в базу данных, и когда запись находится в кэше, после того, как первый поток завершит ее загрузку, второй потоксможет прочитать его из кэша.

Обратите внимание, что эта система не для обеспечения безопасности потоков, ваш загрузчик должен по-прежнему обеспечивать безопасность потоков для разных ключей, а для эффективного использования ресурсов.Предполагается, что загрузка из БД намного медленнее, чем попадание в кеш.

...