为了提高效率而不消耗PostgreSQL池,我想执行一些请求而不是等待它们响应或失败。 100%的请求是重故障保护(内部错误捕获)函数返回VOID,我希望能够执行很多,而不必等待响应释放池连接,因为响应始终为null所有这些程序总是返回VOID。
我有哪些选择?我对不同的解决方案持开放态度。
我甚至想知道如果只是写PERFORM myProcedure()它会起作用,因为perform期望没有返回值。
如果我从未检索到响应,这些libpq机制会起作用吗?或者它会阻止我的所有池,因为我从来没有检索过空值。 http://www.postgresql.org/docs/9.4/static/libpq-async.html
答案 0 :(得分:1)
您正在寻找的是使用流水线的异步查询。查询在连接上排队,按发送顺序执行,结果按执行顺序返回。
这是PostgreSQL协议支持的。某些客户端驱动程序(包括libpq
和PgJDBC
)支持异步查询。但是,我所知道的唯一支持流水线操作的驱动程序是PgJDBC,它不支持单个查询的流水线操作,只支持通过executeBatch
批量运行查询。
要使用libpq的异步机制来执行您想要的操作,您需要一个连接池(因为它无法在一个连接上进行管道连接),并且您需要定期检查以查看查询是否已完成一个连接。你不能发射和忘记,并且没有完成的回调机制。类似于epoll
循环来检查新的待处理输入会发生什么事情,听起来这非常适合node.js的事件驱动模型。
有一些关于向libpq
添加流水线异步模式的讨论,其中查询返回未来对象,您可以检查结果对象是否已填充和/或等待它,同时还调度更多查询。 AFAIK尚未实施任何内容。你可能想参与其中。技术上并不是那么难,而且主要是因为没有人希望它足以帮助实现它。说说pgsql-hackers。
我甚至想知道如果只是写
PERFORM myProcedure()
它会起作用,因为执行期望没有返回值。
没有。它还在等待。它必须知道是否存在错误,并且后续代码也可以预期程序的任何副作用都已完成。
对于node-postgres,请参阅:
看起来异步回调是在节点上执行操作的默认方式。它不会被流水线化。
所以,我要么使用libpq
使用异步查询和epoll
循环的连接池,要么使用node-postgres。