Настройки пружины @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 секунд.
Положительный момент – не требует плановой работы.
Негативный момент — старые данные остаются в кэше.