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 协议支持的。一些客户端驱动程序,包括 libpq
和 PgJDBC
,支持异步查询。但是,我知道的唯一支持流水线的驱动程序是 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。
为了提高效率而不是消耗 PostgreSQL 池,我想执行一些请求而不是等待它们响应或失败。 100% 的请求是 return VOID 的重度故障安全(内部错误捕获)功能,我希望能够执行许多请求而不必等待响应以释放池连接,因为响应总是在进行为空,因为所有这些程序总是 return VOID。
我有什么选择?我对不同的解决方案持开放态度。
我什至想知道是否仅通过编写 PERFORM myProcedure() 就可以正常工作,因为 perform 不需要 return 值。
如果我从未检索到响应,这些 libpq 机制是否有效?或者它会阻止我所有的池,因为我从未检索到空值。 http://www.postgresql.org/docs/9.4/static/libpq-async.html
您似乎要寻找的是 异步 查询,使用 流水线。查询在连接上排队,按发送顺序执行,结果按执行顺序 returned。
这是 PostgreSQL 协议支持的。一些客户端驱动程序,包括 libpq
和 PgJDBC
,支持异步查询。但是,我知道的唯一支持流水线的驱动程序是 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。