我有这样的配置类:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
@Primary
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("dogsInHouse");
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(200)
.expireAfterAccess(Duration.ofDays(30))
.maximumSize(500));
return cacheManager;
}
}
字符串
在属性文件中:
spring.jpa.show-sql=true
型
在服务中:
@Service
@Transactional(readOnly = true)
@Slf4j
@CacheConfig(cacheNames = {"dogsInHouse"})
public class DogsInHouseService {
@Cacheable("dogsInHouse")
public DogsInHouse findDogHouseEnFromDB (String key) {
return dogsEnRepository.findByNameAndLangIs(key);
}
}
型
但我总是在控制台中看到一个选择查询。但我看不到该高速缓存日志。
3条答案
按热度按时间daolsyd01#
在application.properties中使用
logging.level.org.springframework.cache=TRACE
查看是否从该高速缓存中选取了该值。**注意:**当您第一次点击服务时,它将从数据库中获取数据并将数据放入该高速缓存中,下次它将从该高速缓存中获取数据。
请在Sping Boot 应用程序中删除不需要的
@CacheConfig
。我使用
spring-data-jpa
和MySQL进行了演示。使用相同的配置。仅添加以供参考。
字符串
DogInHouse用于测试:
型
DogInHouseRepository用于测试:
型
我的测试服务类:
型
application.properties用于测试:
型
我的pom.xml有这些依赖项:
型
我的申请日志:
首次服务点击:
型
当前在该高速缓存中没有带有传递的键的值,因此,将通过Hibernate执行选择查询以从DB中获取值,并通过该键将值放入该高速缓存中。
第二次服务命中:
型
这一次,该值存在于该高速缓存中,其键与之前传递的键相同,并且从该高速缓存中获取该值。
** Postman 输出:**
的数据
kpbpu0082#
如果每次调用
findDogHouseEnFromDB()
方法时都在控制台中看到选择查询,这应该意味着缓存可能没有按预期工作。在从Lokesh Gupta中阅读“Caffeine Cache with Spring Boot“之后,出于调试目的,您可以添加一个端点或方法来检查该高速缓存的内容,以确保条目按预期被缓存和驱逐。
字符串
注意事项:您可以将部分或全部配置移到
application.properties
文件中,而不是在Java配置文件中配置缓存属性。这可以简化配置并使其更易于管理。请参阅JVM语言的配置库型
如果需要自定义缓存键生成,您可以考虑实现custom
KeyGenerator
或使用@Cacheable
注解上的key
属性来指定如何生成该高速缓存键。型
ktecyv1j3#
根据您的配置,缓存应该可以工作。如果缓存失败,则是由于提供的代码以外的原因。
使用您的代码创建了一个工作演示:caffeine_cache