#java #spring-boot #caching #hazelcast
#java #весенняя загрузка #кэширование #hazelcast
Вопрос:
У меня есть небольшое загрузочное приложение spring, и я использую Hazelcast (топология встроенного кэша) для кэширования. Это класс @Configuration для Hazelcast:
@Configuration
@EnableCaching
public class HazelcastConfig {
public static final String BANKS = "banks";
@Bean
Config config() {
Config config = new Config();
MapConfig mapConfig = new MapConfig();
mapConfig.setTimeToLiveSeconds(3000);
config.getMapConfigs().put(BANKS, mapConfig);
return config;
}
}
Затем я добавляю аннотацию @Cachable к одному из моих методов:
@Cacheable(HazelcastConfig.BANKS)
public UserAccount findByAccountNumber(String accountNumber){
logger.info("INSIDE REPO");
UserAccount userAccount = new UserAccount();
userAccount.setAccountNumber(accountNumber);
userAccount.setId(new Long(1));
userAccount.setAddress("via Rossi");
userAccount.setName("Pippo");
return userAccount;
}
Кажется, все работает нормально: при первом вызове метода программа вводит внутри тела самого метода; со второго раза программа получает значение из кэша (программа не вводит внутри тела метода).
Проблемы начинаются, когда я запускаю 2 экземпляра приложения; когда я запускаю второй экземпляр, я вижу, что Hazelcast понимает, что есть 2 участника (из журналов):
Members {size:2, ver:2} [
Member [172.15.245.39]:5701 - cec4e04a-a8ef-4bd1-9072-5c313ba14666
Member [172.15.245.39]:5702 - bfe7d9a0-dcfd-4a9e-8a10-3e3882e814d2 this
]
но у этих 2 членов, похоже, есть 2 отдельных кэша; это мой тест:
- Запустите экземпляр 1 приложения (порт tomcat 8080)
- Запустите экземпляр 2 приложения (порт tomcat 8090)
- Вызов метода из экземпляра 1-> программа не использует кеш (хорошо, потому что кеш пуст)
- Вызовите метод из экземпляра 1 -> программа использует кэш (хорошо, потому что теперь в кэше есть запись)
- Вызовите метод из экземпляра 2-> программа не использует кеш (KO, потому что я думаю, что кеши двух экземпляров должны иметь одинаковые записи).
Есть предложения?
Комментарии:
1. Попробуйте изменить
@Cacheable(HazelcastConfig.BANKS)
на@Cacheable(value=HazelcastConfig.BANKS, sync=true)
. Это решает проблему?2. Я пытался, но у меня это не работает, та же проблема.
3. У вас такая же проблема, следуя этому руководству: guides.hazelcast.org/caching-springboot ?
4. Какие версии вы используете?
sync=true
для меня, на Spring 2.3.4.RELEASE и Hazelcast 4.0.3, если вы можете опубликовать полный пример кода, это должно быть возможно выяснить. Обратите внимание, что настройкаsync
не обязательно является ответом, скорее объяснением.5. Вы действительно убедились, что значение хранится в Hazelcast? Похоже, вы только что проверили, вызывается ли метод или нет, но вы не заглядывали внутрь самого Hazelcast. Я предполагаю, что здесь используется другой кеш благодаря автоконфигурации Spring.