Windows Server 2012サーバーを実行しています。
PostgreSQL 9.3.5、64ビット
POSTGIS 2.1.3
QGISサーバー2.6.1-2
QGIS Desktop 2.8.3および2.12
QGISデスクトップ2.12を使用してMicrosoft Surface Pro 4タブレットを使用して、Postgresqlデータベースに格納されているいくつかのレイヤーを編集しています。タブレットのレイヤーは、QGISサーバーによって提供されるWFSレイヤーです。
レイヤーにデータを挿入した後で編集をやりすぎて、データをサーバーに強制的に送信して保存すると、データベースで更新が行われないことがあります。
POST httpリクエストがサーバーに正常に到着したことがわかりますが、データベースにコミット(更新)が表示されない場合や、正常に動作してコミットを実行する場合があります。
QGISサーバーのログで確認できます(QGISデスクトップで3つの機能のデータを更新しました):
//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サーバーが内部の「fid」番号を使用して更新する必要のある機能を認識していることを確認できます。一方、私のレイヤーには「id」フィールドが主キーとして含まれています。QGISの内部fidから私のレイヤーのIDへのマッピングを行うと、どこかに失われ、where id = 1510を追加する代わりにWHERE nullがクエリに追加されます。
面白いことに、彼らは40日間働いており、この問題は1回しか発生していませんが、先週から毎日この問題が発生しています... 私はクライアントがFiddlesプロキシを使用してPOST httpリクエストを再送信しますが、同じHTTPポストが機能する場合と機能しない場合があります。
私はそれをQGISデスクトップ2.8、2.10、および2.12でテストし、それらすべてで発生しました(QGISサーバーは2.6.1だと思います)。異なるレイヤーでテストした結果も同じでした。
バグがあるのか、サーバーで適切に実行していないレイヤーの設定があるのかわかりません...
更新2016/03/03
QGISサーバーとQGISデスクトップの両方を2.12.3にアップデートしても問題は解決しません。
何日間ものテストを行った後、問題が発生したときにようやく見つかりました。レイヤーの編集をQGIS(WFS-Tを介して)に保存し、同時にLizmapマップが別のユーザーによってロードされているときに発生します。Lizmapはqgis-serverも使用します。
マップをロードするとき、Lizmapはサーバーをビジー状態にし、WFS-T更新要求が受信されると、QGISサーバーはUPDATE SQLクエリを正しく構築できません。例:
WFS-Tポストの受信時にLizmapがロードされている場合、qgis-serverで生成されるPostgreSQLクエリは次のとおりです。
2016-03-03 11:47:30 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL
一方、WFS-Tが到着したときにqgis-serverがロード中のLizmapにデータを提供していない場合、生成される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句の違いに注意してください。最初のものは何もしません。2つ目は問題なく動作します。
この問題を修正するために、Apacheまたはqgis-serverの構成ファイルを調整できるかどうかはわかりません。
変更を加えずに、サーバーにより多くのハードウェア(4コアと16 GB RAM)を追加してみました。
OSGEO4Wを使用してすべてのソフトウェアアップデートを作成しています。Iaは、ApacheおよびPHPパッケージが何年も更新されていないことをどこかで読みました。それらを手動で更新して、Apacheまたはphpのバージョンが問題の原因ではないことを確認します。
アップデート2016/03/16
ApacheとPHPパッケージを更新しましたが、問題は解決しません。いくつかのテストを行った後、リズマップマップの読み込み中にエディションの変更を(WFS経由で)保存すると、保存に失敗しますが、リズマップの読み込みが行われていないにもかかわらず、失敗する場合があります(ボリュームが低い場合)。これはQGISサーバー(qgis_mapserv.fcgi.exe)の問題です。