Node.js (node-pg) 或 C (libpq) - 执行 PostgreSQL 请求而不等待响应?

Node.js (node-pg) or C (libpq) - perform PostgreSQL request without waiting for response?

为了提高效率而不是消耗 PostgreSQL 池,我想执行一些请求而不是等待它们响应或失败。 100% 的请求是 return VOID 的重度故障安全(内部错误捕获)功能,我希望能够执行许多请求而不必等待响应以释放池连接,因为响应总是在进行为空,因为所有这些程序总是 return VOID。

我有什么选择?我对不同的解决方案持开放态度。

我什至想知道是否仅通过编写 PERFORM myProcedure() 就可以正常工作,因为 perform 不需要 return 值。

如果我从未检索到响应,这些 libpq 机制是否有效?或者它会阻止我所有的池,因为我从未检索到空值。 http://www.postgresql.org/docs/9.4/static/libpq-async.html

您似乎要寻找的是 异步 查询,使用 流水线。查询在连接上排队,按发送顺序执行,结果按执行顺序 returned。

这是 PostgreSQL 协议支持的。一些客户端驱动程序,包括 libpqPgJDBC,支持异步查询。但是,我知道的唯一支持流水线的驱动程序是 PgJDBC,它不支持单个查询的流水线,仅通过 executeBatch.

批量查询 运行

要使用 libpq 的异步机制做你想做的事,你需要一个连接池(因为它不能在一个连接上进行管道传输),你需要定期检查查询是否是在连接上完成。你不能一劳永逸,而且没有完成的回调机制。类似于 epoll 循环来检查新的未决输入就可以了,听起来这很适合 node.js 的事件驱动模型。

有一些关于向 libpq 添加流水线异步模式的讨论,其中查询 return 未来对象,您可以检查结果对象是否已填充 and/or 等待它,同时也调度更多的查询。 AFAIK 尚未实施任何内容。你可能想参与其中。这在技术上并没有那么难,主要是没有足够的人想要它来帮助实施它。谈论 pgsql-hackers。

I was even wondering if by just writting PERFORM myProcedure() it would just work since perform expects no return value.

没有。它还在等待。它必须知道是否有错误,并且还允许后续代码期望该过程的任何副作用都是完整的。

对于 node-postgres,请参阅:

  • Asynchronous Database Queries with PostgreSQL in Node not working
  • How to make a synchronous query (blocking call) with node-postgres?

看起来异步回调是在节点上做事的默认方式。它不会被流水线化。

因此,我要么使用异步查询和 epoll 循环的 libpq 连接池,要么使用 node-postgres。