如何在使用除 Id 之外的字段获取数据时实现二级缓存

Posted

技术标签:

【中文标题】如何在使用除 Id 之外的字段获取数据时实现二级缓存【英文标题】:How to implement second level cache while fetching data using field apart from Id 【发布时间】:2019-08-20 06:35:22 【问题描述】:

我想为其中一个实体实现二级缓存。但是我正在使用不是 ID 的字段获取数据。我在许多帖子中读到二级缓存只有在我们使用 id 获取数据时才有效。有什么办法,以便我可以实现二级缓存以使用 id 以外的字段获取数据? 我正在使用 Eh-cache、JPA 存储库和 Spring Boot。如何实现查询缓存?

在属性文件中:

hibernate.cache.use_second_level_cache=true

hibernate.cache.use_query_cache=true

hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

Repository.java

public interface SomeRepository extends JpaRepository<SomeClass, Long> 

   @Query("SELECT .....WHERE id= :someId")
   @QueryHints( @QueryHint(name = "org.hibernate.cacheable", value ="true") )
   List<Lookup> findAllByProjectId(@Param("someId") Long someId);


【问题讨论】:

【参考方案1】:

一般来说,您问的是如何缓存查询结果。 Hibernate 有一个 QueryCache 用于此目的:

文档引用:

要使用查询缓存,您首先需要使用 以下配置属性:

<property
    name="hibernate.cache.use_query_cache"
    value="true" />

示例 457. 使用 JPA 缓存查询

List<Person> persons = entityManager.createQuery(
  "select p " +
  "from Person p " +
  "where p.name = :name", Person.class)
.setParameter( "name", "John Doe")
.setHint( "org.hibernate.cacheable", "true")
.getResultList();

示例 458. 使用 Hibernate 原生 API 缓存查询

List<Person> persons = session.createQuery(
  "select p " +
  "from Person p " +
  "where p.name = :name")
.setParameter( "name", "John Doe")
.setCacheable(true)
.list();

【讨论】:

但它的基于会话的缓存 如何根据这个注解来做? 查询缓存例如在EHcache的缓存区域中进行管理。 “基于会话”是什么意思?您如何期望这可以通过注释进行配置?您的问题中还没有注释。 会话之间是否共享查询缓存?我正在使用 jpa 存储库和 spring boot?我需要在实体和存储库中添加@cachable 吗? 它应该在会话之间共享 afaik。由于每个查询都必须启用缓存,因此您可以通过注释 as described in Spring documentation 为您的 Spring JPA 存储库启用上述 JPA 查询提示。

以上是关于如何在使用除 Id 之外的字段获取数据时实现二级缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 中定义除 _id 之外的其他主键?

实体框架 6:除 ID 之外的克隆对象 [关闭]

Laravel如何select除id之外的其他字段

使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段

如何从表中获取所有数据,包括表 ID

取消设置 Laravel 中除已知字段之外的所有字段?