0

我正在使用 redisson-hibernate 作为 Hibernate 2 级缓存提供程序。如果 redis 服务器变得不可用,当应用程序运行时,整个应用程序就会宕机。我正试图找到一种在这种情况下断开 L2 缓存的方法。

如果 redis 不可用,hibernate 应该像 L2 被禁用一样工作,并且应该有一些机制(或后续请求),应该在指定数量的 L2 之后检查 redis 可用性,并重新启用 L2。有没有办法做到这一点?

如果没有,我该如何建立这样的机制?我可以尝试运行一个石英作业,它检查 redis 连接,通过修改应用程序配置来终止并重新启动应用程序。但是这种方法很复杂,而且不是很干净。请建议。

4

2 回答 2

1

我已经尝试过您在 SPRING BOOT 应用程序中提到的场景,当我关闭 Redis 时,所有请求 (HTTP) 开始堆积。但是,当我重新启动 Redis 时,应用程序能够像往常一样重新连接和处理。

Hibernate 和 Redis 连接根据“ application.properties ”文件中可用的配置加载。

spring.jpa.properties.hibernate.cache.auto_evict_collection_cache=false
spring.jpa.properties.hibernate.generate_statistics=false
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.javax.cache.missing_cache_strategy=create
spring.jpa.properties.hibernate.cache.redisson.config=redisson.json
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE

我在 Hibernate 或 Spring 文档中找不到任何可以自动检测 L2 何时关闭的参数 wrt / Spring JPA。

我也急切地等待 Hibernate / Spring JPA 中的这种机制,因为这个场景是有效的测试用例,我们肯定会主要在 LOAD/PROD 环境中面临。

于 2019-12-18T10:37:04.987 回答
0

这里有点晚了,但我也面临着与任何子 jcache api(咖啡因、ehcache、hazelcast、infinispan、redisson ......)的休眠和 l2 缓存管理/驱逐相同的问题。

我们有一个非常小的数据库,读取率为 99,999%,可能每周一次或两次写入。我们缓存所有内容(实体、查询、集合)。

我尝试了很多方法来使休眠 l2 缓存自动驱逐条目:

  • 基于子缓存配置大小或基于时间的驱逐
  • 基于尝试驱逐 jpa 缓存的自定义计划任务,基于休眠拦截器在最大计划时间驱逐 chirurgically 实体
  • 尝试使用 debezium 驱逐数据库级别更新检测的缓存....

我总是时不时面临无法加载 id xxx 的实体...尝试了许多配置,许多 java 注释(jpa 或休眠级别),仍然在努力寻找一种使缓存过期并使 jpa/hibernate 回退到的工作方式直接向数据库请求....

我能够勉强解决这个问题的唯一方法是禁用休眠查询缓存并为此创建一个弹簧缓存(对于每个具有方面和自定义实现的 JpaRepo 方法 _(- -)' / )......这与 Debezium 只驱逐更新的实体(来自应用范围内部或外部)是唯一的工作场景。=> 我的缓存查询和实体在缓存(spring 和 hibernate)中被快速检索,并且在 debezium 回调方法中对实体的 chirurgical eviction 使任何数据库修改立即反映在应用程序中(所有服务器侦听 debezium,得到通知并过期其本地缓存)。

这令人沮丧,因为这肯定是生产环境中非常常见的情况......

于 2021-02-09T13:03:25.370 回答