GeoServer SQL重复执行两次及count行数查询禁用问题咨询
GeoServer WFS请求SQL重复执行、count查询无法禁用问题解决
问题现象
多套部署环境下所有图层均稳定复现两类异常:
- 所有请求对应SQL会重复执行两次
- 每次查询前默认执行
SELECT count(*)统计结果行数,图层发布页开启Skip the counting of the numberMatched attribute选项后配置不生效,无法拦截count查询
异常复现的日志快照(业务SQL已脱敏):
2022-06-27 08:57:40,366 DEBUG [org.geotools.jdbc] - CREATE CONNECTION 2022-06-27 08:57:40,448 DEBUG [org.geotools.data.jdbc] - exporting PropertyName 2022-06-27 08:57:40,452 DEBUG [org.geotools.jdbc] - SELECT count(*) AS gt_result_ FROM (SELECT * ...... Request: getFeature service = WFS version = 2.0.0 baseUrl = http://localhost:8085/geoserver/ outputFormat = application/json resolve = none resolveDepth = * resolveTimeout = 300 resultType = results 2022-06-27 08:57:40,648 INFO [org.geoserver.wfs.json] - about to encode JSON 2022-06-27 08:57:40,650 DEBUG [org.geotools.jdbc] - CREATE CONNECTION 2022-06-27 08:57:40,888 DEBUG [org.geotools.data.jdbc] - exporting PropertyName 2022-06-27 08:57:40,888 DEBUG [org.geotools.jdbc] - SELECT "GEOLOC".ST_AsBinary() as "GEOLOC",... 2022-06-27 08:57:41,566 DEBUG [org.geotools.jdbc] - CLOSE CONNECTION 2022-06-27 08:57:41,568 DEBUG [org.geotools.jdbc] - CREATE CONNECTION 2022-06-27 08:57:41,713 DEBUG [org.geotools.data.jdbc] - exporting PropertyName 2022-06-27 08:57:41,714 DEBUG [org.geotools.jdbc] - SELECT "GEOLOC".ST_AsBinary() as "GEOLOC",... 2022-06-27 08:57:42,146 DEBUG [org.geotools.jdbc] - CLOSE CONNECTION 2022-06-27 08:57:42,159 INFO [org.geoserver.flow] - releasing flow controllers for [WFS 2.0.0 GetFeature] 2022-06-27 08:57:42,159 INFO [org.geoserver.flow] - Request completed, running requests: 0, blocked requests: 0
问题成因
- count查询无法禁用:图层发布页的
Skip the counting of the numberMatched attribute配置仅对WFS 1.1.0及更早版本生效。WFS 2.0规范要求响应中必须返回numberMatched字段,该配置默认不会拦截WFS 2.0请求的count统计逻辑,是配置不生效的核心原因。 - SQL重复执行两次:当日志中请求的
outputFormat为application/json时,旧版本GeoServer的GeoJSON编码器存在逻辑缺陷:第一次执行SQL用于统计要素总数、校验输出结构合法性,第二次才是实际读取要素写入响应体,因此会出现两次相同SQL的执行记录,属于版本固有逻辑,非部署或配置错误。
解决方案
修复count查询无法禁用问题
- 全局配置法(推荐,兼容所有WFS版本):在GeoServer部署路径下的
WEB-INF/web.xml文件中添加全局上下文参数,跳过所有版本WFS请求的count统计逻辑,配置后numberMatched字段会返回规范允许的unknown值,不会执行count查询。配置内容如下:
<context-param> <param-name>wfs.skipNumberMatched</param-name> <param-value>true</param-value> </context-param>
添加完成后重启GeoServer服务即可生效。
- 版本降级法:如果业务侧不需要兼容WFS 2.0规范,可将WFS请求版本指定为1.1.0,此时图层发布页的skip count配置会正常生效。
修复SQL重复执行两次问题
- 参数跳过法:在WFS请求中追加
format_options=skipStructuralCheck:true参数,跳过GeoJSON编码前的结构校验步骤,直接复用查询结果输出,可避免第一次预查询的SQL执行,相同SQL仅会执行一次。 - 字段裁剪法:请求时通过
PROPERTYNAME参数仅指定业务需要返回的字段,剔除不需要的空间字段、冗余属性字段,大幅降低重复SQL的执行开销。 - 版本升级法:将GeoServer升级至2.22.x及以上稳定版本,官方在该版本重构了GeoJSON输出模块,默认复用同一次查询的结果集,不会重复创建数据库连接执行相同SQL。
内容的提问来源于stack exchange,提问作者Hannu Huttunen
相关产品推荐
相关产品推荐

