В нашем проекте мы используем аннотацию Infinispan и Spring @Cacheable
, в основном для кэширования результатов ввода-вывода.
Поскольку у нас много одновременных вызовов, мы хотели бы избежать двух потоков, выполняющих одно и то же извлечение данных дважды, поэтому второй вызов метода @Cacheable
(с тем же ключом кэша) блокируется до тех пор, пока первый не завершится и не вернет результат.
В идеале это следует использовать через Spring @Cacheable
, чтобы избежать шаблонного кода. Я заметил, что в Spring 4.3 теперь есть @Cacheable.sync()
, но указано, что это всего лишь подсказка и зависит от базовой реализации поставщика кэша. Кроме того, мы еще не работаем с Spring 4.3, поэтому решение для 4.2 было бы лучше.
sync
. Так что поддержка кажется вероятной, или, возможно, вы можете позвонить ей напрямую. - person Ben Manes   schedule 23.11.2016JCacheCache
делегирует только базовомуJCache
, но это не делает его автоматически блокирующим, верно? - person Didier L   schedule 23.11.2016invoke
должен быть атомарным, поэтому он может блокироваться, ожидая своей очереди. По сути, он должен действовать какsync(key)
, а не как чтение без блокировки, когда он присутствует, потому что JCache не позволяет этого, если не используется загрузчик. - person Ben Manes   schedule 23.11.2016