В нашем проекте мы используем аннотацию Infinispan и Spring @Cacheable
, в основном для кеширования результатов ввода-вывода.Можно ли использовать Infinispan в качестве блокирующего кеша?
Поскольку у нас много одновременных вызовов, мы хотели бы избежать двух потоков, выполняющих одно и то же извлечение данных дважды, следовательно, второй вызов @Cacheable
(с тем же ключом кеша) заблокирован до тех пор, пока первый не завершит и не вернет результат.
Я привык к Ehcache's SelfPopulatingCache
, который поддерживает это автоматически, но есть ли подобная функция в Infinispan?
В идеале это должно использоваться с помощью пружины @Cacheable
, поэтому мы избегаем кода шаблона. Я заметил, что Spring 4.3 теперь имеет @Cacheable.sync()
, но указано, что это всего лишь подсказка, и это зависит от реализации основного поставщика кэша. Кроме того, мы не на весне 4.3, но решение для 4.2 было бы лучше.
Прокси-сервер адаптера Spring JCache для вызова метода [invoke] (https://github.com/spring-projects/spring-framework/blob/master/spring-context-support/src/main/java/org/springframework /cache/jcache/JCacheCache.java#L80) для функции 'sync'. Таким образом, поддержка кажется вероятной или, возможно, вы можете назвать ее напрямую. –
@BenManes 'JCacheCache' делегирует только« JCache », но это не делает его автоматически блокирующим, верно? –
'invoke' должен быть атомарным, поэтому он может блокироваться, ожидая своей очереди. По сути, он должен действовать как «sync (key)», а не читать без блокировки, если он присутствует, поскольку JCache не допускает этого, если не используется загрузчик. –