如何使用libpq执行异步查询

时间:2019-02-06 16:57:46

标签: c postgresql libpq

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

据我了解,如果我使用异步api,那么libpq支持此功能。

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

我多次调用PQsendQuery函数,而无需等待 上一个要完成。

现在我有以下问题:

  • 如何关联以后要提取的结果 PQgetResult到相应的查询?
  • 有没有使用回调而不是PQgetResult的方法?
  • 是否可以在事件循环(例如libevent)中运行此方法?

1 个答案:

答案 0 :(得分:1)

您在这里误解了某些情况:PQsendQuery()发送一个异步查询,这意味着该命令在结果可用之前不会阻塞。但是,在读取所有结果之前,您可能再次调用PQsendQuery()

从联机帮助页:

  

成功调用PQsendQuery后,请调用PQgetResult一次或多次以获取结果。 在相同的连接上,可能不会再次调用PQsendQuery (在同一连接上),直到PQgetResult返回一个空指针,表明该命令已完成。

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

PostgreSQLc异步io api不提供回调机制。但是,这并不难构建自己。可以使用libevent,因为可以使用PQsocket()检索套接字文件描述符。但是,要使它起作用,需要大量胶水。