为了提高效率而不消耗PostgreSQL池,我想执行一些请求,而不是等待它们响应或失败。100%的请求是返回VOID的繁重的故障安全(内部错误捕获)功能,我希望能够执行许多操作而不必等待响应来释放池连接,因为响应总是会为null,因为所有这些过程始终返回VOID。
我有什么选择?我愿意接受不同的解决方案。
我什至想知道是否只通过写PERFORM myProcedure()就可以了,因为perform期望没有返回值。
如果我从不检索响应,这些libpq机制会起作用吗?否则它将阻塞我的所有池,因为我从未检索过null。http://www.postgresql.org/docs/9.4/static/libpq-async.html
您似乎正在寻找的是带有管道的异步查询。查询在连接上排队,按发送顺序执行,并按执行顺序返回结果。
PostgreSQL协议支持此功能。某些客户端驱动程序(包括libpq
和PgJDBC
)支持异步查询。但是,我知道的唯一支持流水线的驱动程序是PgJDBC,它不支持单个查询的流水线,仅通过批处理运行的查询executeBatch
。
要使用libpq的异步机制执行所需的操作,您需要一个连接池(因为它无法在一个连接上进行流水线处理),并且您需要定期检查以查看对连接的查询是否完整。您无法忘记并忘记,并且没有用于完成的回调机制。像epoll
循环这样的操作可以检查新的未决输入,这听起来很适合Node.js的事件驱动模型。
关于将流水线异步模式添加到中libpq
,已经进行了一些讨论,查询将返回将来的对象,您可以检查结果对象是否已填充和/或等待它,同时还分派了更多查询。AFAIK尚未执行任何操作。您可能想参与其中。从技术上讲,这并不是那么困难,并且主要是因为没有足够的人来帮助实现它。说出pgsql-hackers。
我什至想知道是否只写
PERFORM myProcedure()
就可以了,因为perform期望没有返回值。
不,它还在等待。它必须知道是否存在错误,并且还允许后续代码期望该过程的所有副作用都已完成。
有关node-postgres的信息,请参见:
看起来异步回调是在节点上执行操作的默认方式。它不会被流水线化。
因此,我要么使用带有libpq
异步查询和epoll
循环的连接池,要么使用node-postgres。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句