DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →

Quarkus 二级缓存启动报 Weigher not configured,补齐权重配置

只设置maximum-weight可能在启动时失败,负值还可能退回按条数淘汰。明确选择条数或权重约束,权重模式需提供实际weigher,不把数值当作字节上限。

给Hibernate二级缓存设置 maximum-weight 后,Quarkus启动报 IllegalStateException: Weigher not configured。先看同一缓存区域有没有配套的 weigher-class,不要只把权重上限改大。

Quarkus 3.40.1 的具体配置问题还包含另一种表现:负的maximum-weight可能与内部“未设置”状态冲突,悄悄退回按对象条数淘汰。没有异常也不代表配置按预期生效。

先决定限制条数还是限制权重

条数与权重是不同约束。若业务只要求某区域最多保留一定数量的条目,可以明确使用 object-count,并移除该区域冲突的权重配置。它不能保证缓存占用恰好不超过某个字节数。

确实需要权重模式时,应同时配置非负的合理上限与项目提供的weigher。例如默认持久化单元中,一个区域的结构示例是:

quarkus.hibernate-orm.cache."org.acme.MyEntity".memory.maximum-weight=100000
quarkus.hibernate-orm.cache."org.acme.MyEntity".memory.weigher-class=org.acme.MyEntityWeigher

区域名、类名和上限均为示例。MyEntityWeigher 必须真实存在,按框架要求实现 com.github.benmanes.caffeine.cache.Weigher,并具有公开无参构造函数。它返回的权重单位要与100000采用同一约定;若每条都固定返回1,限制的实际上仍接近条目数,不是可靠的内存估算。

同一缓存区域的 object-count 与 maximum-weight 互斥。多持久化单元还要核对配置落在哪个单元和区域,不能把默认单元的例子直接复制过去,以为目标区域也已经采用。

不依赖缺失weigher的默认值说明

3.40.1的部分说明曾写到没有weigher时默认权重为1,但这个具体组合仍会在启动阶段报未配置。先补齐明确的配对配置,不要把这句话当成运行时已提供默认实现的证据。

负值也不能用来表示“暂时无限制”或“关闭权重”。它可能让设置被忽略,并留下另一种默认淘汰方式。要切换模式,应明确删除不用的配置项并采用目标模式的合法配置,而不是用特殊负数猜测内部约定。

没有评估真实大小时,不要把上限单位标成字节。即使weigher按估算大小返回数值,也要考虑缓存键值的实际表示、估算误差以及应用其他内存,不能把一个区域的权重限制当成进程内存硬上限。

检查启动之外的实际区域

在隔离环境确认weigher类可加载、配置没有互斥项,再检查对应区域是否按预期创建并使用权重策略。用不同大小的业务样本核对淘汰行为,关注真实区域与持久化单元,不只看应用已启动。

如果启动失败发生在类加载或构造函数中,应沿实际异常继续检查,不要统一归到权重缺失。后续版本是否更早拒绝非法组合也应核对正式实现;提早报错与自动补足weigher是两种不同变化。