如何使用 libpq 执行异步查询

How to execute an async Query with libpq

我想以非阻塞方式使用 libpq 执行 SQL 查询。 因此,我希望在我的查询执行完毕时得到通知。

据我了解,如果我使用异步 api.

,则 libpq 支持此功能

使用 PQsendQuery 函数,我可以将查询发送到后端,使用 PQgetResult 函数,我可以检索结果。

我多次调用PQsendQuery函数而没有等待 上一个完成。

现在我有以下问题:

您误解了这里的内容:PQsendQuery() 发送了一个异步查询,意思是该命令在结果可用之前不会阻塞。但是,您可以在读取所有结果之前再次调用PQsendQuery()

来自联机帮助页:

After successfully calling PQsendQuery, call PQgetResult one or more times to obtain the results. PQsendQuery may not be called again (on the same connection) until PQgetResult has returned a null pointer, indicating that the command is done.

如联机帮助页所示,您必须打开多个连接才能 运行 多个并发查询。然后将不同的结果与不同的数据库句柄相关联。

PostgreSQLc async io api不提供回调机制;然而,这并不难建立自己。可以使用 libevent,因为您可以使用 PQsocket() 检索套接字文件描述符。然而,需要相当多的胶水才能使其发挥作用。