在application.properties中使用logging.level.org.springframework.cache=TRACE
以查看该值是否从缓存中拾取.
NOTE:当您第一次命中服务时,它将从数据库中取出数据,并将数据放入缓存中,下一次,它将从缓存中取出数据.
请在Spring Boot App中删除@CacheConfig
个您不需要的内容.
我已经在演示中使用了spring-data-jpa
和MySQL.
使用相同的配置.只是添加以供参考.
@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;
}
}
DogInHouse用于测试:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DogInHouse {
@Id
@GeneratedValue
private int id;
@Column(name = "name")
private String name;
}
DogInHouseRepository用于测试:
public interface DogInHouseRepository extends JpaRepository<DogInHouse, Integer> {
}
我的测试服务类:
@Service
@Slf4j
public class DogsInHouseService {
@Autowired
private DogInHouseRepository dogsEnRepository;
@Cacheable(value = "dogsInHouse")
public Optional<DogInHouse> findDogHouseById(int key) {
return dogsEnRepository.findById(key);
}
}
application.properties用于测试:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=Anish@123
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.springframework.cache=TRACE
我的pom.xml有以下依赖关系:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
</dependencies>
My Application Log:个
First Time Service Hit:个
2023-10-21T22:22:16.575+05:30 TRACE 14989 --- [nio-8080-exec-3] o.s.cache.interceptor.CacheInterceptor : Computed cache key '1' for operation Builder[public java.util.Optional com.example.springbootmysql.DogsInHouseService.findDogHouseById(int)] caches=[dogsInHouse] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
2023-10-21T22:22:16.576+05:30 TRACE 14989 --- [nio-8080-exec-3] o.s.cache.interceptor.CacheInterceptor : No cache entry for key '1' in cache(s) [dogsInHouse]
2023-10-21T22:22:16.577+05:30 TRACE 14989 --- [nio-8080-exec-3] o.s.cache.interceptor.CacheInterceptor : Computed cache key '1' for operation Builder[public java.util.Optional com.example.springbootmysql.DogsInHouseService.findDogHouseById(int)] caches=[dogsInHouse] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
2023-10-21T22:22:16.587+05:30 DEBUG 14989 --- [nio-8080-exec-3] org.hibernate.SQL :
select
d1_0.id,
d1_0.name
from
dog_in_house d1_0
where
d1_0.id=?
当前高速缓存中没有带有所传递的键的值,
因此,将通过Hibernate执行一个SELECT查询以带来值
来自DB,值由该键放入缓存中.
Second Time Service Hit:个
2023-10-21T22:23:33.485+05:30 TRACE 14989 --- [nio-8080-exec-6] o.s.cache.interceptor.CacheInterceptor : Computed cache key '1' for operation Builder[public java.util.Optional com.example.springbootmysql.DogsInHouseService.findDogHouseById(int)] caches=[dogsInHouse] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
2023-10-21T22:23:33.490+05:30 TRACE 14989 --- [nio-8080-exec-6] o.s.cache.interceptor.CacheInterceptor : Cache entry for key '1' found in cache 'dogsInHouse'
这一次,该值以与之前相同的键存在于缓存中
早些时候传递,并从缓存中提取该值.
Postman Output: