能否为Infinispan简单缓存建索引?报ISPN000436错原因
问题根因与解决方案
简单模式(配置simpleCache(true))的Infinispan缓存不支持索引能力,这是你遇到报错的核心原因,具体逻辑如下:
simpleCache(true)是Infinispan提供的极简缓存配置模板,设计目标是提供最高性能的纯键值存储能力,开启后会强制关闭索引、持久化、事务、自定义拦截链等所有非必要高级特性。哪怕你提前写了索引相关配置,只要开启简单缓存模式,这些不兼容的配置都会被重置,甚至直接触发配置校验失败。- 你的代码里把索引配置写在了
simpleCache(true)之前,配置构建器执行到simpleCache(true)时会直接清空前面设置的索引相关配置,同时因为你同时配置了索引和简单缓存两个互斥的特性,defineConfiguration步骤实际会抛出配置校验异常。 - 你写了空的catch块把这个配置异常直接吞掉了,导致自定义缓存配置根本没有成功注册到CacheManager中,后续调用
getCache获取缓存时,自然找不到对应配置,抛出ISPN000436: Cache 'MyCache' has been requested, but no matching cache configuration exists异常。
修复方式
如果需要使用索引提升缓存内搜索的响应速度,直接删除simpleCache(true)配置即可,修正后的参考代码如下:
private Cache createCache(String cacheName) { try { final Configuration configuration = new ConfigurationBuilder() .indexing() .enable() // 多数Infinispan版本默认关闭索引,需要显式开启 .addIndexedEntity(MyEntity.class) .statistics().enable() .build(); cacheManager.defineConfiguration(cacheName, configuration); }catch (RuntimeException ex){ // 禁止空吞异常,至少打印日志方便定位问题 ex.printStackTrace(); throw ex; } return cacheManager.getCache(cacheName); }
额外注意事项
- 使用索引查询能力需要提前引入
infinispan-query模块依赖,12.x及以上版本还需要额外指定索引存储后端(比如堆内存索引、Lucene文件索引等)。 - 不要写空catch块吞异常,配置阶段的错误如果被隐藏,后续排查问题的成本会非常高。
内容的提问来源于stack exchange,提问作者Aguid
相关产品推荐
相关产品推荐

