PostgreSQL 透過 LISTEN
和 NOTIFY
指令提供非同步通知。用戶端連線使用 LISTEN
指令註冊對特定通知通道的興趣 (並且可以使用 UNLISTEN
指令停止監聽)。當任何連線執行具有該通道名稱的 NOTIFY
指令時,所有監聽特定通道的連線都將被非同步通知。可以傳遞一個 「有效負載」 字串,以將其他資料傳達給監聽者。
libpq 應用程式將 LISTEN
、UNLISTEN
和 NOTIFY
指令作為普通的 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
指針就足夠了; relname
和 extra
欄位不代表單獨的分配。 (這些欄位的名稱是歷史原因;特別是,通道名稱不必與關係名稱有任何關係。)
範例 32.2 给出一個示例程式,說明了非同步通知的使用。
PQnotifies
實際上並沒有從伺服器讀取資料; 它只是返回先前被另一個 libpq 函式吸收的訊息。 在 libpq 的舊版本中,確保及時收到 NOTIFY
訊息的唯一方法是不斷提交指令,即使是空的指令,然後在每次 PQexec
之後檢查 PQnotifies
。 雖然這仍然有效,但它已被棄用,因為它浪費了處理能力。
當您沒有有用的指令要執行時,檢查 NOTIFY
訊息的更好方法是呼叫 PQconsumeInput
,然後檢查 PQnotifies
。 您可以使用 select()
等待從伺服器傳來資料,因此不使用任何CPU電力,除非有事情要做。 (請參閱 PQsocket
以取得與 select()
一起使用的檔案描述符號碼。) 請注意,無論您是使用 PQsendQuery
/PQgetResult
提交指令,還是僅使用 PQexec
,這都能正常工作。 但是,您應該記得在每次 PQgetResult
或 PQexec
之後檢查 PQnotifies
,以查看在指令處理期間是否有任何通知進來。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。