支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.9. 非同步通知 #

PostgreSQL 透過 LISTENNOTIFY 指令提供非同步通知。用戶端連線使用 LISTEN 指令註冊對特定通知通道的興趣 (並且可以使用 UNLISTEN 指令停止監聽)。當任何連線執行具有該通道名稱的 NOTIFY 指令時,所有監聽特定通道的連線都將被非同步通知。可以傳遞一個 有效負載 字串,以將其他資料傳達給監聽者。

libpq 應用程式將 LISTENUNLISTENNOTIFY 指令作為普通的 SQL 指令提交。 隨後可以透過呼叫 PQnotifies 檢測到 NOTIFY 訊息的到達。

函式 PQnotifies 從伺服器收到的未處理通知訊息列表中返回下一個通知。 如果沒有擱置的通知,則返回空指針。 一旦從 PQnotifies 返回通知,它將被視為已處理,並將從通知列表中刪除。

PGnotify *PQnotifies(PGconn *conn);

typedef struct pgNotify
{
    char *relname;              /* notification channel name */
    int  be_pid;                /* process ID of notifying server process */
    char *extra;                /* notification payload string */
} PGnotify;

在處理 PQnotifies 返回的 PGnotify 物件後,請務必使用 PQfreemem 釋放它。 釋放 PGnotify 指針就足夠了; relnameextra 欄位不代表單獨的分配。 (這些欄位的名稱是歷史原因;特別是,通道名稱不必與關係名稱有任何關係。)

範例 32.2 给出一個示例程式,說明了非同步通知的使用。

PQnotifies 實際上並沒有從伺服器讀取資料; 它只是返回先前被另一個 libpq 函式吸收的訊息。 在 libpq 的舊版本中,確保及時收到 NOTIFY 訊息的唯一方法是不斷提交指令,即使是空的指令,然後在每次 PQexec 之後檢查 PQnotifies。 雖然這仍然有效,但它已被棄用,因為它浪費了處理能力。

當您沒有有用的指令要執行時,檢查 NOTIFY 訊息的更好方法是呼叫 PQconsumeInput,然後檢查 PQnotifies。 您可以使用 select() 等待從伺服器傳來資料,因此不使用任何CPU電力,除非有事情要做。 (請參閱 PQsocket 以取得與 select() 一起使用的檔案描述符號碼。) 請注意,無論您是使用 PQsendQuery/PQgetResult 提交指令,還是僅使用 PQexec,這都能正常工作。 但是,您應該記得在每次 PQgetResultPQexec 之後檢查 PQnotifies,以查看在指令處理期間是否有任何通知進來。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。