Ho un'applicazione client C# che utilizza Npgsql per chiamare una funzione plpgsql in PostgreSQL 9.1.4. La funzione richiede molto tempo e vorrei segnalare i progressi al cliente in qualche modo. Come dovrei farlo?Come segnalare l'avanzamento dalla funzione PostgreSQL di lunga esecuzione al client
Il meccanismo LISTEN/NOTIFY è perfetto per questo, tranne per il fatto che l'intera operazione viene eseguita all'interno di una transazione e gli eventi NOTIFY non vengono inviati fino alla fine della transazione, il che è inutile per me.
L'altra cosa che ho provato è RAISE AVVISO, che posso elaborare sul client, ma anche quelle notifiche sembrano essere memorizzate nel buffer per un po 'e inviate in batch. È meglio di niente, ma non è l'ideale. C'è un modo in cui posso "svuotarli", quindi vengono inviati immediatamente al cliente?
Con PostgreSQL 8.4 e versioni successive è anche possibile fornire un codice di errore a AVVISO RAISE, che rende più facile rilevare la differenza tra i messaggi di stato e altre notifiche che potrebbero essere emesse. –
Hai ragione, si scopre che gli AVVISI * erano * consegnati mentre venivano sollevati, ma c'era un rallentamento molto strano nella funzione, che non si verificava quando eseguivo direttamente la stessa query. Ho trovato una soluzione alternativa per ora. – EM0
AVVISO RAISE ha un relativo overhead significativo: è l'handshake di rete tra client e server. Di solito non alzo avviso ogni iterazione, ma noto ogni mille iterazioni. –