【问题标题】:Hibernate first level cache is missedHibernate 一级缓存丢失
【发布时间】:2019-06-12 06:07:13
【问题描述】:

我是 JPA/Hibernate 一级缓存的新手。

我有以下存储库类

每次我调用 findByState 方法(在同一个事务中),我都会看到休眠 sql 查询输出到控制台

public interface PersonRepository extends JpaRepository<PersonEntity, id> {

    @Query("select person from PersonEntity p where name= (?1)")
    List<PersonEntity> findByState(String state);
    ....
}

希望结果被一级缓存缓存,不会重复查询数据库。

我做错了什么?

【问题讨论】:

  • 一级缓存与其会话相关联。例如,如果您在会话中工作并且您两次点击相同的查询,则将从一级缓存中检索数据,但是当会话关闭时,缓存的数据将消失。
  • 请提供调用此方法的代码。是否在同一事务中第二次调用该方法?
  • @JaspreetJolly 是的,它在同一个事务中。
  • 据我了解,一级缓存是默认缓存,没有机制可以禁用它。所以,唯一的问题应该是调用是在 2 个不同的会话中进行的。

标签: java hibernate jpa spring-data-jpa first-level-cache


【解决方案1】:

人们对缓存经常存在误解。

Hibernate 默认不缓存查询和查询结果。唯一使用一级缓存的是当您调用EntityManger.find() 时,您将看不到 SQL 查询正在执行。如果实体已经加载,缓存用于避免创建对象。

您要查找的内容称为“查询缓存”。

这可以通过设置hibernate.cache.use_query_cache=true来启用

请在官方文档中阅读有关此主题的更多信息:

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#caching-query

【讨论】:

    【解决方案2】:

    查询将始终转到数据库。第一级缓存将仅包含构造的实体。其目的是确保相同的 db id 映射到相同的实体对象(在会话内) 它也可以使用查询缓存。您必须启用每个查询。查看文档https://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch06.html

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 2013-10-31
      • 2013-12-14
      • 1970-01-01
      • 2015-02-05
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多