我有这样一个配置类:

@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);
    }
}

但我总是在控制台中看到一个SELECT查询.但我没看到缓存日志(log).

推荐答案

application.properties中使用logging.level.org.springframework.cache=TRACE以查看该值是否从缓存中拾取.

NOTE:当您第一次命中服务时,它将从数据库中取出数据,并将数据放入缓存中,下一次,它将从缓存中取出数据.

请在Spring Boot App中删除@CacheConfig个您不需要的内容.


我已经在演示中使用了spring-data-jpaMySQL.

使用相同的配置.只是添加以供参考.

@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:

enter image description here

Java相关问答推荐

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

Java在模块化jar文件中找不到类,但是javap可以

Listview—在Android Java中正确链接项目时出错

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

路径映射未发生

给定Java枚举类,通过值查找枚举

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

如何创建一个2d自上而下的移动系统,其中移动,同时持有两个关键是可能的处理?

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

try 判断可选参数是否为空时出现空类型安全警告

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

声明带有泛型的函数以用作查找映射中的值

为什么有两种实现来检索数组类的组件类型?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

Java创建带有扩展通配符的抽象处理器

如何获得凌空cookies ,并设置它在下一个请求- android

Java集合:NPE,即使没有添加空值

Java KeyListener不工作或被添加

Java System.getProperty在哪里检索user.home?

JAVA 正则表达式识别字符串string或字符串内的字符char