Настройки пружины @cacheable для кеширования на 10 секунд

Я пишу Java-проект с использованием Spring Framework 3.2.4.

У меня много SQL-запросов, которые нужно кэшировать в течение 10 секунд.

Я знаю что с @cacheable аннотации я могу кешировать результат функции.

Чего я не понимаю, так это как кешировать всего 10 секунд. я знаю, что вы можете добавить условия в кэшируемую аннотацию, но мне сложно понять, как добавить время к этим условиям.

любая информация по этому вопросу будет принята с благодарностью.

3 ответа

Решение

Spring не предлагает этого из коробки, но поддерживает адаптеры, и вы можете использовать, например, адаптер гуавы, который, помимо прочего, позволяет настроить время ожидания истечения.

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
  <property name="caches">
    <list>
      <bean name="testCache"
            class="org.hypoport.springGuavaCacheAdapter.SpringGuavaCacheAdapter">
        <property name="expireAfterAccessInSeconds" value="10"/>
        <property name="expireAfterWriteInSeconds" value="10"/>
      </bean>
    </list>
  </property>
</bean>

Вы можете использовать Планировщик, чтобы периодически вызывать метод обслуживания, который высвобождает кэши.

Планировщик:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.beans.factory.annotation.Autowired;

public class Scheduler {

        @Autowired
        private SomeService someService;

        @Scheduled(fixedRate = 10000)
        public void evictCaches() {
                someService.evictCaches();
        }
}

Обслуживание:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class SomeService {

        @CacheEvict(value = { "cache1", "cache2" }, allEntries = true)
        public void evictAllCaches() {
        }
}

Вы можете решить эту проблему с помощью объекта LocalDateTime. Например:

      @Cacheable(value="forecast", key = "#date.toString()")
public void forecast(LocalDateTime date){
    //
}
public void call(){
        LocalDateTime dateTime = LocalDateTime.now();
        int currentSecond = dateTime.getSecond();
        int newSecond = currentSecond - (currentSecond % 10);
        forecast(dateTime.withSecond(newSecond));
}

Срок действия кэша истечет через 10 секунд.

Положительный момент – не требует плановой работы.

Негативный момент — старые данные остаются в кэше.

Другие вопросы по тегам