首页 / 浏览问题 / 云GIS / 问题详情
iServer上发布的拓展服务中DatasetVector的空间查询强制关闭进程
253EXP 2023年09月06日
配置了一个拓展服务,输入点的经纬度后,会自动生成20m和50m的圆形线,然后去466G的多边形数据中进行获取与这个圆形线相交的多边形的属性的空间查询

之前在本地测试iServer发布测试时,可以在8~10秒内完成检索

现在作为拓展服务配置到服务器的iServer上后,进行相同的操作,会报以下问题:

The specified CGI application encountered an error and the server terminated the process.

为此,我尝试在Java中每一步之后在控制台显示进度,然后发现

geometry20m = new GeoCircle(point2D, radiusLonlat20m).convertToLine(16);

System.out.println("geometry20m = " + geometry20m.getBounds().toString());

recordset20m = datasetVector.query(geometry20m, 0.0, CursorType.STATIC);

System.out.println("recordCount20m = " + recordset20m.getRecordCount());

控制台显示到geometry20m之后便再也没有显示了,看起来是datasetVector.query出现了问题,即使使用try...catch包住这段也不行

请问这是什么原因?

1个回答

您好,建议看下查询失败的时候 iServer 自带的 iObjects Java 组件(\support\objectsjava\bin\log)目录下是否有异常日志输入,以及看下 iServer 的 bin 目录下是否有 hs_ 开头的 JVM 崩溃日志,若相关异常信息请展示出来,造成 CGI 异常的可能有多种,仅从这条信息目前无法准确判断异常原因,需要根据 iServer、组件和 JVM 的异常信息结合分析具体的异常原因。

根据您的问题描述,在本地测试是可以成功的,在服务器上出现的异常,初步判断可能是以下原因,建议可优先排查:

  1. 堆溢出:调整 iServer 启动参数,调大 JVM 运行占用的资源,在 iServer 的 bin 目录下的 catalina.sh/bat 文件中调整;
  2. 检查是否对待查询的矢量数据集是否有创建空间索引,466G的单个数据集体量不小,必须得创建空间索引后再进行查询操作。

希望可以帮到您。

2,168EXP 2023年09月06日
您好,感谢解答

关于空间索引,我这边早上已经确认过了,确实有做空间索引

这个466g的数据里面快20亿条数据

我在iDesktopX里打开属性表会卡死,然后在里面进行sql查询也会卡死,最后不得已用任务管理器强制中断了iDesktopX

但添加到地图上然后单个点击能显示出属性

服务器的性能我确认过,比我本地的电脑性能要好,我电脑以前也没有特别设置过catalina.sh,现在数据是放在udbx里,如果转移到postgresql里会不会更好?
在 iDesktopX 打开属性表操作是全表读,20亿条记录太多了,会卡死是正常的情况。

放到 postgresql 里面理论上会好点儿,但您们的数据量太大了,几乎不会有太大的改善,建议可以的话,最好还是对 20 条记录的数据集进行分表,分数据集,减少每个数据集的记录条数,查询的时候多发几个请求,iServer服务端本身也是异步处理请求的,这样既可以提升查询速率,也可以减少查询压力,最后在前端合并多个请求的查询结果即可。
好的,感谢解答,我去研究一下如何切分数据

我刚刚关闭了iServer(大概隔了四五个小时),在关闭iServer的时候,本来控制台上卡在那边的进程突然就把后续的内容都显示在了控制台上,里面的内容也都正常

请问这也纯粹是因为数据量太大太慢的原因吗?
您好,问题解决了

似乎是打成压缩包的时候空间索引的结构被破坏了

解压后虽然工作空间里打开显示有做空间索引,但实际上检索花了3个多小时

在花了13小时多点时间重做了空间索引后

可以10秒左右结束检索了

好的,问题解决了就好yes

...