c - 如何使用 libpq 执行异步查询
问题描述
我想以非阻塞方式使用 libpq 执行 SQL 查询。因此,我希望在我的查询完成执行时收到通知。
据我了解,如果我使用异步 api,libpq 支持这一点。
使用该PQsendQuery
函数,我可以将查询发送到后端,使用该PQgetResult
函数我可以检索结果。
PQsendQuery
我多次调用该函数而不等待前一个函数完成。
现在我有以下问题:
- 如何将稍后要提取的结果与
PQgetResult
相应的查询相关联? - 有没有使用回调而不是 PQgetResult 的方法?
- 有没有办法在事件循环中运行它(例如 libevent)?
解决方案
您在这里误解了一些东西:PQsendQuery()
发送异步查询,这意味着该命令在结果可用之前不会阻塞。但是,在读取所有结果之前,您不得再次致电!PQsendQuery()
从手册页:
调用 PQsendQuery 成功后,调用 PQgetResult 一次或多次获取结果。在 PQgetResult 返回一个空指针之前,不能再次调用 PQsendQuery(在同一个连接上),表明命令已完成。
如手册页所示,您必须打开多个连接才能运行多个并发查询。然后将不同的结果与不同的数据库句柄相关联。
PostgreSQLc async io api 不提供回调机制;但是,这并不难建立自己。可以使用 libevent,因为您可以使用PQsocket()
. 但是,需要相当多的胶水才能使其起作用。
推荐阅读
- xamarin - 此 Xamarin Forms ContentPage 中的此空白行来自哪里?
- javascript - 如何在 React 中获取 Drupal 数据库中的用户节点?
- excel - DataValidation List 比较是否相同?
- javascript - Shopify“添加到购物车”无法正常工作
- xamarin - 访问集合 List Xamarin xaml 中的集合
- google-bigquery - 如何在 Google BigQuery 中安排查询以将新数据附加到表中?
- sql - 如何转置
- python - 为 Bokeh 消费准备数据框
- c - 关于动态分配内存给 char 指针的简单问题
- javascript - Javascript函数不会在调用时更改html div的css