Ignite 2缓存读写正常但SQL表查询无数据问题求助
验证POJO继承体系的SQL注解配置
确保父类标注了@QuerySqlEntity,子类所有需映射到SQL的字段都正确标注@QuerySqlField;同时检查缓存配置CacheConfiguration的setIndexedTypes()是否包含子类类型——Ignite对继承类的SQL映射需要显式声明子类,否则可能无法将数据同步到SQL表。核对测试与生产环境的缓存配置一致性
对比测试环境和主机进程的缓存配置:确认是否开启SQL支持、setSqlSchema()指定的Schema是否一致、setQueryEntities()是否正确配置子类的字段映射,有没有遗漏索引等关键配置项。排查数据写入的API与上下文差异
检查主机进程写入数据的方式:是否使用了IgniteCache.put()/putAll()以外的API?是否开启了事务但未提交?有没有使用localPut这类本地缓存操作而非分布式操作?这些情况可能导致数据仅写入缓存内存,未触发SQL索引同步。确认集群节点的POJO类加载一致性
确保集群所有节点都加载了相同版本的POJO类(包括父类和子类),类加载不一致会导致SQL元数据不匹配,即使表已创建,数据也无法被SQL引擎识别。可通过节点日志查看类加载相关信息。开启针对性SQL调试日志
调整日志级别,开启org.apache.ignite.internal.processors.query和org.apache.ignite.internal.processors.cache.query的DEBUG日志,查看数据写入时是否有SQL索引更新的日志条目,或元数据加载、字段映射的细节信息(即使无显式报错,日志中可能藏有线索)。检查SQL表元数据与POJO的匹配度
通过JDBC执行以下查询,确认表结构与POJO字段完全匹配:SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '你的表名'; SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名';重点检查字段名、数据类型是否一致,有没有字段缺失的情况。
验证缓存数据的有效性
通过缓存API(比如cache.get(key)或cache.query(new ScanQuery<>()))确认数据确实存在于缓存中,且字段值符合预期(比如没有不符合SQL类型的异常值)。检查集群节点状态与分区完整性
确认主机进程所在节点正常加入集群,没有分区丢失、节点离线的情况。可通过Ignite控制台或ignite node list命令查看节点状态,确保数据写入的分区处于可用状态。
内容的提问来源于stack exchange,提问作者ObsceneAlbatros

