【发布时间】:2020-06-07 12:15:25
【问题描述】:
当在具有自定义键(如名称)的存储库上使用 @Cacheable 注释(org.springframework.cache.annotation.Cacheable)时,遇到在每个连续请求上对 id 字段运行额外查询的问题。
请参阅下面的存储库代码:
public interface StatusRepository extends JpaRepository<Status, Integer> {
@Cacheable(value = "StatusByStatusNameCache" , key="#statusName")
public Status findByStatusName(String statusName);
}
上面你可以看到缓存是只为状态名称定义的,现在在运行第一个请求后得到以下 Hibernate 控制台,查询状态名称:
Hibernate: select status0_.status_id as status_i1_7_, status0_.status_name as status_n2_7_ from status status0_ where status0_.status_name=?
Hibernate: select event0_.event_id as event_id1_3_, event0_.event_name as event_na2_3_ from events event0_ where event0_.event_name=?
现在再打第二个请求,在带有 id 的控制台中获取休眠查询:
Hibernate: select event_.event_id, event_.event_name as event_na2_3_ from events event_ where event_.event_id=?
Hibernate: select requestcha_.request_channel_id, requestcha_.request_channel_name as request_2_6_ from request_channels requestcha_ where requestcha_.request_channel_id=?
Hibernate: select status_.status_id, status_.status_name as status_n2_7_ from status status_ where status_.status_id=?
我不明白为什么这个额外的查询会因为 status_name 查询被缓存而触发,但是如何在第一次请求后的每个连续调用中停止这个 id 查询。
【问题讨论】:
-
请从日志中复制信息或类似文本并格式化为代码。它使阅读、搜索和复制变得更加容易。
-
这是什么
Cacheable注解?来自 Spring 的那个还是来自 JPA 的那个?两个查询是否来自同一个会话? -
@JensSchauder 我已经更新了帖子,即使用弹簧可缓存并包含代码格式的日志。
标签: spring hibernate jpa caching spring-data-jpa