这里有点晚了,但我也面临着与任何子 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,得到通知并过期其本地缓存)。
这令人沮丧,因为这肯定是生产环境中非常常见的情况......