Apache Ignite 2.15执行大量SQL查询时出现OOM问题求助
Apache Ignite 2.15大量SQL查询OOM问题的处理建议
我们在运行大量SQL查询时遭遇OOM(内存不足)问题,使用的是Apache Ignite 2.15版本,查询代码如下:
SqlFieldsQuery sqlQuery = new SqlFieldsQuery(query); if (args != null) { sqlQuery.setArgs(args); } FieldsQueryCursor<List<?>> cursor = cache.query(sqlQuery);
堆内存分析显示,org.apache.ignite.internal.processors.query.RunningQueryManager中的map维护着所有运行中查询的引用,但查询执行完成后该map并未被清理。经排查,该问题已有公开记录,但暂无官方后续处理进展。
临时缓解方案
- 显式关闭游标:当前代码未主动关闭
FieldsQueryCursor,Ignite游标不会自动释放关联资源,必须在查询完成后调用cursor.close()。推荐使用try-with-resources语法,确保资源自动释放:try (FieldsQueryCursor<List<?>> cursor = cache.query(sqlQuery)) { // 处理查询结果逻辑 } - 限制并发查询数:通过Ignite配置限制同时运行的SQL查询数量,避免RunningQueryManager中的map过度膨胀。修改
IgniteConfiguration中的SQL配置:IgniteConfiguration cfg = new IgniteConfiguration(); SqlConfiguration sqlCfg = new SqlConfiguration(); sqlCfg.setMaxConcurrentQueries(100); // 根据业务场景调整合理数值 cfg.setSqlConfiguration(sqlCfg); - 主动触发查询清理:通过JMX调用
RunningQueryManager的清理接口,或自定义定时任务触发内部清理逻辑(注意:依赖Ignite内部API,需考虑版本兼容性)。
长期解决方向
- 跟进官方版本更新:关注该问题的修复进度,一旦官方发布包含修复的新版本,及时升级Ignite。
- 监控查询生命周期:使用Ignite自带的监控工具(如Web Console、JMX)实时跟踪运行中查询的数量与内存占用,提前识别异常趋势。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

