2016-11-22 6 views
1

В нашем проекте мы используем аннотацию Infinispan и Spring @Cacheable, в основном для кеширования результатов ввода-вывода.Можно ли использовать Infinispan в качестве блокирующего кеша?

Поскольку у нас много одновременных вызовов, мы хотели бы избежать двух потоков, выполняющих одно и то же извлечение данных дважды, следовательно, второй вызов @Cacheable (с тем же ключом кеша) заблокирован до тех пор, пока первый не завершит и не вернет результат.

Я привык к Ehcache's SelfPopulatingCache, который поддерживает это автоматически, но есть ли подобная функция в Infinispan?

В идеале это должно использоваться с помощью пружины @Cacheable, поэтому мы избегаем кода шаблона. Я заметил, что Spring 4.3 теперь имеет @Cacheable.sync(), но указано, что это всего лишь подсказка, и это зависит от реализации основного поставщика кэша. Кроме того, мы не на весне 4.3, но решение для 4.2 было бы лучше.

+0

Прокси-сервер адаптера 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'. Таким образом, поддержка кажется вероятной или, возможно, вы можете назвать ее напрямую. –

+0

@BenManes 'JCacheCache' делегирует только« JCache », но это не делает его автоматически блокирующим, верно? –

+0

'invoke' должен быть атомарным, поэтому он может блокироваться, ожидая своей очереди. По сути, он должен действовать как «sync (key)», а не читать без блокировки, если он присутствует, поскольку JCache не допускает этого, если не используется загрузчик. –

ответ

2

Если вы хотите, чтобы эта функция была готова к обновлению до 4.3. Если вы используете 4.2, обновление до 4.3 должно быть безболезненным в любом случае (если это не так, сообщите нам об этом!)

Как уже упоминал Бен, вы можете использовать мост JCache, который имеет явную поддержку для такого вызова (т. Е. он будет работать для любой библиотеки кеширования, совместимой с JSR-107). У Infinispan еще нет такой родной функции, у меня только submitted a feature request in their tracker.

Смежные вопросы