Я использую сервер Windows Server 2012.
PostgreSQL 9.3.5, 64-битная версия
ПОСТГИС 2.1.3
QGIS Server 2.6.1-2
QGIS Desktop 2.8.3 и 2.12
Я использую планшет Microsoft Surface Pro 4 с использованием QGIS Desktop 2.12 для редактирования некоторых слоев, хранящихся в базе данных Postgresql. Слои в планшете - это слои WFS, обслуживаемые QGIS Server.
Когда я включаю редактирование после вставки некоторых данных в слой для принудительной отправки и сохранения данных на сервере, иногда обновление не выполняется в базе данных.
Я вижу, что HTTP-запрос POST поступает на сервер нормально, но иногда я не вижу коммит (обновление) в базе данных, а иногда он работает нормально и выполняет коммит.
В журналах QGIS Server я вижу (я обновил данные 3 функций в QGIS Desktop):
//QGIS SERVER RECEIVED HTTP POST FROM QGIS DESKTOP
[4852][11:11:19] ********************new request*************** [4852][11:11:19] remote ip: 192.168.144.20 [4852][11:11:19] CONTENT_TYPE: text/xml [4852][11:11:19] HTTP_USER_AGENT: Mozilla/5.0 QGIS/2.8.2-Wien [4852][11:11:19] MAP:D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs
[4852][11:11:19] REQUEST:Transaction
[4852][11:11:19] REQUEST_BODY:<Transaction xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
service="WFS" xsi:schemaLocation="http://www.qgis.org/gml
http://eudala2.getxo.net/qgis/qgis_mapserv.fcgi.exe?map=D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs&SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=getxo_alumbrado_arquetas_registros_cajas&SRSNAME=EPSG:23030"
xmlns:gml="http://www.opengis.net/gml"><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.3"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.4"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo</Name><Value
xmlns="http://www.opengis.net/wfs">A</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_tapa</Name><Value
xmlns="http://www.opengis.net/wfs">B</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">estado</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">O</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_union_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">N</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_estado_union_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_intervencion</Name><Value
xmlns="http://www.opengis.net/wfs">OTR</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">m_codcalle</Name><Value
xmlns="http://www.opengis.net/wfs">20</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.5"/></Filter></Update></Transaction>
[4852][11:11:19] SERVICE:WFS
[4852][11:11:19] SRSNAME:EPSG:23030
[4852][11:11:19] VERSION:1.0.0
[4852][11:11:22] Request finished in 2977 ms
Хорошо, когда я просматриваю логи PostgreSQL, я вижу, что в обновлении есть предложение WHERE NULL, которое ничего не обновляет ..
//POSTGRESQL UPDATE QUERIES
2016-01-29 11:11:22 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN: exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN: exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "tipo"='A',"tipo_tapa"='B',"estado"='D',"p_tierra_tipo_electrodo_tierra"='O',"p_tierra_tipo_union_electrodo_tierra"='N',"p_tierra_estado_union_tierra"='D',"tipo_intervencion"='OTR',"m_codcalle"='20',"id_modelo"=0,"alumbrado"='t'
WHERE NULL
В данных POST я вижу, что QGIS Server знает, какую функцию нужно обновить, используя внутренний номер "fid". Мой слой, с другой стороны, имеет поле "id" в качестве первичного ключа. Где-то, когда он отображает внутреннюю привязку QGIS на id моего слоя, он теряется и добавляет в запрос WHERE null вместо добавления где id = 1510.
Самое смешное, что они работают 40 дней, и у них эта проблема возникла только один раз, но с прошлой недели у них была эта проблема каждый день ... С тех пор иногда работает, а иногда нет. Я пересылаю HTTP-запрос POST от клиента, использующего прокси-сервер Fiddles, и тот же пост HTTP иногда работает, а иногда нет.
Я проверил это в QGIS Desktop 2.8, 2.10 и 2.12 и происходит во всех из них (я думаю, что QGIS Server - 2.6.1). Я также проверил это с различными слоями с тем же результатом.
Я не знаю, есть ли ошибка или есть какая-то конфигурация для слоя, который я не делаю должным образом на сервере ...
ОБНОВЛЕНИЕ 03/03/2016
Я обновил до QGIS Server и QGIS Desktop до 2.12.3 и проблема продолжается.
После многих дней испытаний я наконец-то обнаружил, когда возникла проблема. Это происходит, когда я сохраняю правки слоя в QGIS (через WFS-T), и в то же время карта Lizmap загружается другим пользователем. Lizmap также использует qgis-сервер.
Похоже, что при загрузке карты Lizmap загружает сервер, а при получении запроса на обновление WFS-T сервер QGIS не может правильно построить SQL-запрос UPDATE. Пример:
Если в момент получения сообщения WFS-T происходит загрузка Lizmap, запрос PostgreSQL, сгенерированный в qgis-server:
2016-03-03 11:47:30 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL
С другой стороны, если qgis-сервер не передает данные загружаемой Lizmap, когда приходит WFS-T, сгенерированный запрос PostgreSQL:
2016-03-03 11:46:21 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1'
Обратите внимание на разницу в предложении where. Первый это ничего не делает. Второй работает нормально.
Я не знаю, могу ли я настроить Apache или какие-либо файлы конфигурации для qgis-server, чтобы решить эту проблему.
Я попытался дать гораздо больше оборудования для сервера (4 ядра и 16 ГБ оперативной памяти) без каких-либо изменений.
Я делаю все обновления программного обеспечения, используя OSGEO4W. Я где-то читал, что пакеты Apache и PHP не обновлялись годами. Я попытаюсь обновить их вручную и проверить, что версия apache или php не является причиной проблемы.
ОБНОВЛЕНИЕ 16/03/2016
Я обновил пакеты Apache и PHP, и проблема продолжается. После нескольких тестов я обнаружил, что если я сохраняю изменения редакции (через WFS) во время загрузки карты Lizmap, сохранение завершается неудачно, но в некоторых других случаях происходит сбой, хотя загрузка Lizmap отсутствует (на более низком томе). Это проблема в QGIS Server (qgis_mapserv.fcgi.exe).
Ответы:
Наконец, Матиас Кун , один из разработчиков QGIS, дал мне ключ.
Предложение WHERE создано для проверки типа первичного ключа таблицы. Это должно быть целое число, и в некоторых моих таблицах я видел тип Numeric (8,0).
Эти таблицы и первичные ключи были созданы сторонним приложением некоторое время назад.
Я изменил тип на Integer, и все тесты, которые я провел с тех пор, сработали (я сделал более 100 тестов редакции через WFS, на мой взгляд, достаточно, чтобы прийти к выводу, что проблема была решена)
источник