Ich benutze PostgreSQL 8.3, und schreibe ein Programm in C++, das die libpq
API verwendet. Ich führe Befehle asynchron mit der PQsendQuery()
Funktion aus. Ich versuche, eine Timeout-Verarbeitungsfunktion zu implementieren. Ich implementierte es, indem ich PQcancel()
anrief, wenn das Zeitlimit abläuft. Ich habe es mit einer Abfrage getestet, die 100 000 Zeilen zurückgibt (es dauert etwa 0,5 s) mit einer Zeitüberschreitung von 1 ms und festgestellt, dass PQcancel()
blockiert, bis der Server die Ausführung beendet, und dann mit einer erfolgreichen Abfrage zurückkehrt.PostgreSQL: Abfrage abbrechen von C/C++ Programm
Ich verstehe, dass die Dokumentation besagt, dass die Abfrage auch bei einer erfolgreichen Abbruchanforderung weiterhin ausgeführt werden kann. Mein Problem ist, dass PQcancel()
blockiert mein Thread der Ausführung, die nicht akzeptabel ist, weil ich asynchrone Verarbeitung (mit dem Boost Asio-Framework) verwenden, so dass mein Programm, das andere Aufgaben als die Ausführung der SQL-Abfrage haben kann, nur auf einem Thread ausgeführt wird .
Ist es normal, dass PQcancel()
blockiert? Gibt es eine Möglichkeit, eine nicht blockierende Stornierungsanfrage zu stellen?
Randnotiz: Version 8.3 wird nicht unterstützt. Erwägen Sie, auf eine der unterstützten Versionen zu aktualisieren. –
Es ist die Version, die von der Linux-Distribution geliefert wird, die ich verwende (SUSE 11). – petersohn
Es spielt keine Rolle, wie es versendet wird. Es ist immer noch veraltet. –