【问题标题】:Node.js (node-pg) or C (libpq) - perform PostgreSQL request without waiting for response?Node.js (node-pg) 或 C (libpq) - 执行 PostgreSQL 请求而不等待响应?
【发布时间】:2015-08-28 12:30:29
【问题描述】:

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

我有什么选择?我愿意接受不同的解决方案。

我什至想知道如果只写 PERFORM myProcedure() 是否会正常工作,因为 perform 不期望返回值。

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

【问题讨论】:

  • 这是一个假设性问题,还是您的池中连接不足?如果是前者,那么我不会担心,它只会在您的设计和/或实现中出现问题时发生。

标签: javascript c node.js postgresql libpq


【解决方案1】:

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

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

要使用 libpq 的异步机制来做你想做的事,你需要一个连接池(因为它不能在一个连接上进行管道传输),你需要定期检查查询是否在一个连接。你不能开火然后忘记,并且没有完成的回调机制。像 epoll 循环来检查新的待处理输入就可以了,听起来这很适合 node.js 的事件驱动模型。

关于向libpq 添加流水线异步模式进行了一些讨论,其中查询返回一个未来对象,您可以检查结果对象是否已填充和/或等待它,同时还分派更多查询。 AFAIK 尚未实施任何内容。您可能想参与其中。从技术上讲,这并不难,主要是因为没有足够的人来帮助实施它。谈论 pgsql-hackers。

我什至想知道,如果只写 PERFORM myProcedure() 它就可以工作,因为 perform 不期望返回值。

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

对于 node-postgres,请参阅:

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

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

【讨论】:

  • 那么你的意思是没有办法在不阻塞池的情况下查询元素? SQL 本身内部呢?...没有我可以运行的 pgsql 命令,这样我就可以返回而无需等待,例如。 pastie.org/10380701
  • PostgreSQL 中没有在服务器中运行异步或后台命令的工具。您必须在连接上运行命令然后等待它完成,除了上面提到的 PgJDBC 管道和 libpq/pgjdbc 异步支持的例外。在所有这些情况下,连接仍然很忙,并且在您的查询完成之前无法为其他查询提供服务。
  • @Edward 如果你真的很感兴趣,你可以使用动态后台工作者和 SPI 为 PostgreSQL 9.4+ 实现一个......
  • 什么意思?请解释一下... :) 还是您在描述中所说的那样?
  • 我实际上正在尝试联系 brianc,看看是否可以从他那里得到更多想法。
猜你喜欢
  • 2017-06-30
  • 1970-01-01
  • 2011-01-12
  • 2015-01-06
  • 1970-01-01
  • 2012-12-30
  • 2014-04-24
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多