Server QGIS mengirimkan PEMBARUAN… DI MANA NULL ke postgis dalam lapisan WFS

9

Saya menjalankan server Windows Server 2012.

PostgreSQL 9.3.5, 64-bit

POSTGIS 2.1.3

QGIS Server 2.6.1-2

QGIS Desktop 2.8.3 dan 2.12

Saya menggunakan tablet Microsoft Surface Pro 4 menggunakan QGIS Desktop 2.12 untuk mengedit beberapa lapisan yang disimpan dalam database Postgresql. Lapisan dalam tablet adalah lapisan WFS yang dilayani oleh QGIS Server.

Ketika saya mengedit Google setelah memasukkan beberapa data di lapisan untuk memaksa data yang akan dikirim dan disimpan di server kadang-kadang pembaruan tidak dilakukan dalam Database.

Saya dapat melihat bahwa permintaan http POST tiba ke server ok, tapi kadang-kadang saya tidak dapat melihat komit (pembaruan) dalam database dan beberapa kali lain berfungsi ok dan melakukan komit.

Dalam log Server QGIS saya bisa melihat (saya memperbarui data 3 fitur di 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&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=getxo_alumbrado_arquetas_registros_cajas&amp;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

Ok, ketika saya melihat log PostgreSQL saya bisa melihat bahwa pembaruan memiliki klausa WHERE NULL, yang tidak memperbarui apa pun ..

//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

Saya dapat melihat dalam data POST bahwa QGIS Server tahu fitur mana yang perlu diperbarui menggunakan nomor de fid "internal". Lapisan saya, di sisi lain, memiliki bidang "id" sebagai kunci utama. Di suatu tempat ketika melakukan pemetaan dari QGIS internal fid ke id layer saya itu hilang dan menambahkan WHERE nol ke kueri alih-alih menambahkan di mana id = 1510.

Yang lucu adalah mereka telah bekerja selama 40 hari dan mereka hanya mendapatkan masalah ini satu kali, tetapi sejak minggu lalu mereka memiliki masalah ini setiap hari ... Sejak itu kadang-kadang bekerja dan kadang tidak. Saya mengirim ulang permintaan POST http dari klien yang menggunakan proxy Fiddles dan kiriman HTTP yang sama kadang-kadang berhasil dan di waktu lain tidak.

Saya mengujinya di QGIS Desktop 2.8, 2.10 dan 2.12 dan terjadi pada semuanya (Server QGIS 2.6.1 saya pikir). Saya juga mengujinya dengan berbagai lapisan dengan hasil yang sama.

Saya tidak tahu apakah ada bug atau ada semacam konfigurasi pada layer yang tidak saya lakukan dengan benar di server ...


PEMBARUAN 03/03/2016

Saya memperbarui ke Server QGIS dan Desktop QGIS ke 2.12.3 keduanya dan masalah berlanjut.

Setelah beberapa hari tes saya akhirnya menemukan ketika masalah terjadi. Saya terjadi ketika saya menyimpan suntingan layer di QGIS (via WFS-T) dan pada saat yang sama Peta Lizmap sedang dimuat oleh pengguna lain. Lizmap juga menggunakan qgis-server.

Sepertinya saat memuat peta, Lizmap membuat server sibuk dan ketika permintaan pembaruan WFS-T diterima, QGIS Server tidak mampu membangun permintaan SQL UPDATE dengan benar. Contoh:

Jika ada pemuatan Lizmap pada saat posting WFS-T diterima, permintaan PostgreSQL yang dihasilkan di server qgis adalah:

2016-03-03 11:47:30 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL

Di sisi lain, jika qgis-server tidak melayani data ke Lizmap memuat ketika WFS-T tiba, permintaan PostgreSQL yang dihasilkan adalah:

2016-03-03 11:46:21 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1' 

Perhatikan perbedaan dalam klausa where. Yang pertama tidak melakukan apa-apa. Yang kedua berfungsi ok.

Saya tidak tahu apakah saya bisa menyetel Apache atau file konfigurasi apa pun untuk qgis-server untuk memperbaiki masalah ini.

Saya mencoba memberikan lebih banyak perangkat keras ke server (4 core dan 16 GB RAM) tanpa chnage.


Saya membuat semua pembaruan perangkat lunak menggunakan OSGEO4W. Ia membaca di suatu tempat bahwa paket Apache dan PHP belum diperbarui selama bertahun-tahun. Saya akan mencoba memperbaruinya secara manual dan memeriksa apakah versi apache atau php bukan penyebab masalahnya.


PEMBARUAN 16/03/2016

Saya memperbarui paket Apache dan PHP dan masalahnya berlanjut. Setelah beberapa tes saya menemukan bahwa jika saya menyimpan perubahan edisi (melalui WFS) ketika saya memuat Peta Lizmap, penyimpanan gagal, tetapi beberapa kali lainnya tetap gagal meskipun tidak ada pemuatan Lizmap (pada volume yang lebih rendah). Ini adalah masalah di QGIS Server (qgis_mapserv.fcgi.exe).

Egidi
sumber
Bisakah Anda menampilkan log server QGIS saat berfungsi? Saya berasumsi mereka terlihat sama, tetapi kita perlu mengkonfirmasi asumsi itu.
alexGIS
@alexGIS Ya mereka sama. Saya telah menulis jawaban dengan solusi untuk masalah tersebut. Terima kasih atas bantuan Anda!
Egidi

Jawaban:

7

Akhirnya, Matthias Kuhn , salah satu pengembang QGIS memberi saya kunci.

The klausa WHERE dibangun memeriksa jenis kunci utama dari meja. Ini harus menjadi Integer dan dalam beberapa tabel saya, saya melihat bahwa jenis itu Numeric (8,0).

Tabel dan kunci utama tersebut dibuat oleh aplikasi pihak ketiga beberapa waktu lalu.

Saya mengubah tipe menjadi Integer dan semua tes yang telah saya buat sejak saat itu telah berhasil (saya telah membuat lebih dari 100 tes edisi melalui WFS, cukup menurut saya untuk menyimpulkan bahwa masalahnya telah diselesaikan)

Egidi
sumber