(本文档仅供参考)
问题说明:
查询全省数据 1400万,服务器设置内存数据库最大返回行数1000,内存数据库最大返回单元格数为20万。
查询的时候没有提示什么,就这样卡住了,造成服务器内存溢出。 这个限制为什么不起作用?
问题原因:
目前产品灵活分析的数据获取逻辑是分页返回的。因此,这种情况下除非在当前页数据量超过20万单元格,否则无法达到系统限制的数据量产生限制提示。
对于在分页返回的灵活分析中为什么会造成内存溢出?这是因为当前的灵活分析是基于原生SQL数据集创建的,灵活分析中的分页也是基于原生SQL数据集的返回数据进行分页获取。由于原生SQL数据集在获取数据时,会根据驱动游标机制去实行每次提取数据的条数。由于不同数据库的游标机制完善情况不一致,如若当前数据库的驱动没有完善游标机制,因此就会存在数据一次性全部获取的情况,导致系统内存溢出。
解决方案:
针对这种情况,目前存在以下两种处理方案:
方案一:使用SQL数据集代替原生SQL数据集(推荐)
使用SQL数据集创建灵活分析,灵活分析中的分页SQL会拼接在SQL中再进行查询,此时的查询已限制了分页行数,因此不会导致一次性加载数据过多导致内存溢出。
原生SQL数据集的灵活分析查询:
SQL数据集的灵活分析查询:
方案二:在连接数据源中添加参数实现游标机制
不同的数据库有不同的参数配置方式。例如MYSQL数据库,建议可以尝试在数据源的连接字符串中添加参数useCursorFetch=true&defaultFetchSize=10000,如果以上参数无法实现游标机制效果,可以联系现场的数据库管理员了解详细情况。