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

时间:2015-08-28 03:53:51

标签: javascript c node.js postgresql libpq

为了提高效率而不消耗PostgreSQL池,我想执行一些请求而不是等待它们响应或失败。 100%的请求是重故障保护(内部错误捕获)函数返回VOID,我希望能够执行很多,而不必等待响应释放池连接,因为响应始终为null所有这些程序总是返回VOID。

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

我甚至想知道如果只是写PERFORM myProcedure()它会起作用,因为perform期望没有返回值。

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

1 个答案:

答案 0 :(得分:1)

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

这是PostgreSQL协议支持的。某些客户端驱动程序(包括libpqPgJDBC)支持异步查询。但是,我所知道的唯一支持流水线操作的驱动程序是PgJDBC,它不支持单个查询的流水线操作,只支持通过executeBatch批量运行查询。

要使用libpq的异步机制来执行您想要的操作,您需要一个连接池(因为它无法在一个连接上进行管道连接),并且您需要定期检查以查看查询是否已完成一个连接。你不能发射和忘记,并且没有完成的回调机制。类似于epoll循环来检查新的待处理输入会发生什么事情,听起来这非常适合node.js的事件驱动模型。

有一些关于向libpq添加流水线异步模式的讨论,其中查询返回未来对象,您可以检查结果对象是否已填充和/或等待它,同时还调度更多查询。 AFAIK尚未实施任何内容。你可能想参与其中。技术上并不是那么难,而且主要是因为没有人希望它足以帮助实现它。说说pgsql-hackers。

  

我甚至想知道如果只是写PERFORM myProcedure()它会起作用,因为执行期望没有返回值。

没有。它还在等待。它必须知道是否存在错误,并且后续代码也可以预期程序的任何副作用都已完成。

对于node-postgres,请参阅:

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

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