如何在使用除 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 之外的字段获取数据时实现二级缓存的主要内容,如果未能解决你的问题,请参考以下文章