首页 > 解决方案 > 如何使用 libpq 执行异步查询

问题描述

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

据我了解,如果我使用异步 api,libpq 支持这一点。

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

PQsendQuery我多次调用该函数而不等待前一个函数完成。

现在我有以下问题:

标签: cpostgresqllibpq

解决方案


您在这里误解了一些东西:PQsendQuery()发送异步查询,这意味着该命令在结果可用之前不会阻塞。但是,在读取所有结果之前,您不得再次致电!PQsendQuery()

从手册页:

调用 PQsendQuery 成功后,调用 PQgetResult 一次或多次获取结果。在 PQgetResult 返回一个空指针之前,不能再次调用 PQsendQuery(在同一个连接上),表明命令已完成。

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

PostgreSQLc async io api 不提供回调机制;但是,这并不难建立自己。可以使用 libevent,因为您可以使用PQsocket(). 但是,需要相当多的胶水才能使其起作用。


推荐阅读