Tôi đang chạy một máy chủ Windows Server 2012.
PostgreSQL 9.3.5, 64-bit
BÀI VIẾT 2.1.3
Máy chủ QGIS 2.6.1-2
Máy tính để bàn QGIS 2.8.3 và 2.12
Tôi đang sử dụng máy tính bảng Microsoft Surface Pro 4 bằng cách sử dụng QGIS Desktop 2.12 để chỉnh sửa một số lớp được lưu trữ trong cơ sở dữ liệu Postgresql. Các lớp trong máy tính bảng là các lớp WFS được phục vụ bởi Máy chủ QGIS.
Khi tôi chỉnh sửa sau khi chèn một số dữ liệu trong lớp để buộc dữ liệu được gửi và lưu trữ trong máy chủ đôi khi việc cập nhật không được thực hiện trong Cơ sở dữ liệu.
Tôi có thể thấy rằng yêu cầu POST http đến máy chủ ok, nhưng đôi khi tôi không thể thấy một cam kết (cập nhật) trong cơ sở dữ liệu và một số lần khác nó hoạt động tốt và thực hiện cam kết.
Trong nhật ký của Máy chủ QGIS tôi có thể thấy (Tôi đã cập nhật dữ liệu của 3 tính năng trong Máy tính để bàn của QGIS):
//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
Ok, khi tôi xem xét nhật ký PostgreSQL tôi có thể thấy rằng bản cập nhật có mệnh đề WHERE NULL, không cập nhật gì cả ..
//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
Tôi có thể thấy trong dữ liệu POST mà Máy chủ QGIS biết tính năng nào cần được cập nhật bằng cách sử dụng số "fid" nội bộ. Mặt khác, lớp của tôi có trường "id" làm khóa chính. Ở đâu đó khi ánh xạ từ fid nội bộ của QGIS đến id của lớp tôi sẽ bị mất và thêm WHERE null vào truy vấn thay vì thêm vào nơi id = 1510.
Điều buồn cười là họ đã làm việc được 40 ngày và họ chỉ gặp vấn đề này một lần, nhưng kể từ tuần trước họ đã gặp vấn đề này mỗi ngày ... Kể từ đó đôi khi làm việc và đôi khi không. Tôi gửi lại yêu cầu POST http từ proxy ysing Fiddles của khách hàng và cùng một bài đăng HTTP đôi khi không hoạt động và những lần khác thì không.
Tôi đã thử nghiệm nó trong QGIS Desktop 2.8, 2.10 và 2.12 và xảy ra trong tất cả chúng (Máy chủ QGIS là 2.6.1 tôi nghĩ). Tôi cũng đã thử nghiệm nó với các lớp khác nhau với cùng kết quả.
Tôi không biết nếu có lỗi hoặc có một số loại cấu hình cho lớp tôi không làm đúng trong máy chủ ...
CẬP NHẬT 03/03/2016
Tôi đã cập nhật lên Máy chủ QGIS và Máy tính để bàn QGIS lên 2.12.3 và vấn đề vẫn tiếp tục.
Sau nhiều ngày thử nghiệm cuối cùng tôi đã tìm thấy khi vấn đề xảy ra. Tôi xảy ra khi tôi lưu các chỉnh sửa của lớp trong QGIS (thông qua WFS-T) và đồng thời Bản đồ Lizmap đang được tải bởi người dùng khác. Lizmap cũng sử dụng máy chủ qgis.
Giống như khi tải bản đồ, Lizmap làm cho máy chủ bận rộn và khi yêu cầu cập nhật WFS-T được phục hồi, Máy chủ QGIS không có khả năng xây dựng truy vấn SQL CẬP NHẬT chính xác. Ví dụ:
Nếu có tải Lizmap tại thời điểm bài đăng WFS-T được nhận, truy vấn PostgreQuery được tạo trong qgis-server là:
2016-03-03 11:47:30 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL
Mặt khác, nếu qgis-server không phục vụ dữ liệu cho Lizmap đang tải khi WFS-T đến, truy vấn PostgreQuery được tạo là:
2016-03-03 11:46:21 CET LOG: 00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1'
Lưu ý sự khác biệt trong mệnh đề where. Cái đầu tiên nó không làm gì cả. Cái thứ hai hoạt động tốt.
Tôi không biết liệu tôi có thể điều chỉnh Apache hoặc bất kỳ tệp cấu hình nào cho máy chủ qgis để khắc phục sự cố này không.
Tôi đã cố gắng cung cấp nhiều phần cứng hơn cho máy chủ (4 lõi và RAM 16 GB) mà không gặp sự cố.
Tôi đang thực hiện tất cả các bản cập nhật phần mềm bằng OSGEO4W. Tôi đã đọc ở đâu đó rằng các gói Apache và PHP đã không được cập nhật trong nhiều năm. Tôi sẽ cố gắng cập nhật chúng theo cách thủ công và kiểm tra xem phiên bản apache hoặc php không phải là nguyên nhân gây ra sự cố.
CẬP NHẬT 16/03/2016
Tôi đã cập nhật các gói Apache và PHP và vấn đề vẫn tiếp tục. Sau một vài thử nghiệm, tôi thấy rằng nếu tôi lưu các thay đổi phiên bản (thông qua WFS) trong khi tôi đang tải Bản đồ Lizmap, thì việc lưu không thành công, nhưng một số lần khác vẫn không thành công mặc dù không tải Lizmap (với âm lượng thấp hơn). Đây là một vấn đề trong Máy chủ QGIS (qgis_mapserv.fcgi.exe).