我没有找到任何文档来阐明Postgres如何在套接字协议级别处理异步非块请求的请求-响应。
例如,建议在 pg-client 中只使用一个套接字连接到 pg-server 的查询 sql。我想有两种方法可以处理 asyc 操作:
- 客户端无法在第一个请求不响应之前发送第二个命令。
client socket1 server
-----query1---------->
<----response1--------
------query2--------->
<-----response1-------
- socket 同时发送两个查询,并通过唯一标志进行不同的响应。
client socket1 server
-------query1 + uid:msg1----->
-------query2 + uid:msg2----->
<------response2 + uid:msg2---
<------response1 + uid:msg1---
我认为这应该是将请求作为真正的异步进程处理的第二种方法,但我没有从文档中找到任何资源。 问题:
- 哪一个是 Postgres 处理异步套接字操作?
- 如果使用第一种方法,为什么?
在网络协议级别,同步模式和异步模式之间没有区别。区别仅在于客户端 API 的工作方式。
在任何给定时间,始终最多有一个语句处于活动状态。例如,请参阅简单协议的文档,但扩展协议的文档是相同的。
区别在于客户端 API 的工作方式:
-
在同步模式下,客户端线程被阻塞,直到查询结果我们完成。
在 异步模式下,控制权在发送查询后立即返回到客户端线程,客户端可以在等待服务器响应时执行其他操作。它必须定期轮询套接字以检查结果是否已到达。然后它可以读取和处理结果。
如果要同时运行两个语句,则必须使用两个数据库会话。