Ich habe eine C# -Client-Anwendung, die Npgsql verwendet, um eine plpgsql-Funktion in PostgreSQL 9.1.4 aufrufen. Die Funktion benötigt sehr viel Zeit und ich möchte dem Kunden auf gewisse Weise Fortschritte mitteilen. Wie soll ich das machen?Wie melden Fortschritt von lang laufenden PostgreSQL-Funktion zu Client
Der LISTEN/NOTIFY-Mechanismus klingt perfekt dafür, außer dass das Ganze innerhalb einer Transaktion läuft und NOTIFY-Ereignisse erst am Ende der Transaktion gesendet werden, was für mich nutzlos ist.
Die andere Sache, die ich ausprobiert habe, ist RAISE NOTICE, die ich auf dem Client verarbeiten kann, aber selbst diese Benachrichtigungen scheinen für eine Weile gepuffert und in Stapeln gesendet zu werden. Es ist besser als nichts, aber nicht ideal. Gibt es eine Möglichkeit, sie zu "spülen", so dass sie sofort an den Kunden gesendet werden?
Mit PostgreSQL 8.4 und höher können Sie auch einen Fehlercode an RAISE NOTICE liefern, der es einfacher macht, den Unterschied zwischen Fortschrittsnachrichten und anderen Mitteilungen, die ausgegeben werden können, zu unterscheiden. –
Sie haben recht, es stellt sich heraus, dass die NOTIZEN * geliefert wurden, als sie ausgelöst wurden, aber es gab eine merkwürdige Verlangsamung in der Funktion, was nicht passierte, wenn ich dieselbe Abfrage direkt ausführte. Ich habe jetzt einen Workaround dafür gefunden. – EM0
RAISE NOTICE hat einen relativ hohen Overhead - es ist ein Netzwerk-Handshake zwischen Client und Server. Normalerweise merke ich nicht jede Iteration, merke aber jede tausend Iteration. –