Можно ли использовать Infinispan в качестве блокирующего кэша?

В нашем проекте мы используем аннотацию Infinispan и Spring @Cacheable, в основном для кэширования результатов ввода-вывода.

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

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

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


person Didier L    schedule 22.11.2016    source источник
comment
Прокси-сервер адаптеров Spring JCache для вызова вызов метода для функции sync. Так что поддержка кажется вероятной, или, возможно, вы можете позвонить ей напрямую.   -  person Ben Manes    schedule 23.11.2016
comment
@BenManes JCacheCache делегирует только базовому JCache, но это не делает его автоматически блокирующим, верно?   -  person Didier L    schedule 23.11.2016
comment
invoke должен быть атомарным, поэтому он может блокироваться, ожидая своей очереди. По сути, он должен действовать как sync(key), а не как чтение без блокировки, когда он присутствует, потому что JCache не позволяет этого, если не используется загрузчик.   -  person Ben Manes    schedule 23.11.2016


Ответы (1)


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

Как уже упоминал Бен, вы можете использовать мост JCache, который имеет явную поддержку такого вызова (т. е. он будет работать для любой библиотеки кэширования, совместимой с JSR-107). У Infinispan еще нет такой встроенной функции, я только что отправил запрос на функцию в их трекере.

person Stephane Nicoll    schedule 23.11.2016