为特定查询禁用 Hibernate 二级缓存读取或更新
Disabling Hibernate Second level cache Read Or Update for specific query
我将 Redis 作为 Hibernate 的二级缓存。我根据实体的 ID 为实体启用了缓存。但是,我很少有查询需要 运行 基于名称、年龄等其他属性...在这种情况下,我当前的实现仍在访问缓存,丢失缓存,如果有任何更改则更新实体。由于它是基于ID进行缓存,因此它丢失了它。如果没有使用 ID 请求,我想忽略去缓存。有什么办法吗?
如果您需要任何其他信息,请告诉我。
您可以使用 Session.setCacheMode(CacheMode)
设置 CacheMode.IGNORE。
这将忽略二级缓存从数据库中读取数据。
有两种second-level-caching:
- 缓存实体(按 id,或缓存自然 id -> id 映射)和集合
- 查询缓存
您似乎一直在考虑第一个发生在您 session.load(MyEntity.class, id)
时发生的事情。当您执行另一种类型的查询(例如 SELECT * FROM MyEntity WHERE age > 18
)时,您可以使用查询缓存,通过设置 hibernate.cache.use_query_cache=true
并使用提示 org.hibernate.cacheable
标记查询以通过查询字符串缓存结果来启用。
我将 Redis 作为 Hibernate 的二级缓存。我根据实体的 ID 为实体启用了缓存。但是,我很少有查询需要 运行 基于名称、年龄等其他属性...在这种情况下,我当前的实现仍在访问缓存,丢失缓存,如果有任何更改则更新实体。由于它是基于ID进行缓存,因此它丢失了它。如果没有使用 ID 请求,我想忽略去缓存。有什么办法吗?
如果您需要任何其他信息,请告诉我。
您可以使用 Session.setCacheMode(CacheMode)
设置 CacheMode.IGNORE。
这将忽略二级缓存从数据库中读取数据。
有两种second-level-caching:
- 缓存实体(按 id,或缓存自然 id -> id 映射)和集合
- 查询缓存
您似乎一直在考虑第一个发生在您 session.load(MyEntity.class, id)
时发生的事情。当您执行另一种类型的查询(例如 SELECT * FROM MyEntity WHERE age > 18
)时,您可以使用查询缓存,通过设置 hibernate.cache.use_query_cache=true
并使用提示 org.hibernate.cacheable
标记查询以通过查询字符串缓存结果来启用。