联接是如何建立起来的

Postgres 是用一个简单的"每用户一进程"的client/server 模型实现的。在这种模式里一个客户端进程只是与一个服务器进程联接。因为我们不知道具体要建立多少个联接,所以我们不得不利用一个主进程 在每次联接请求时派生出一个新的服务器进程来。这个主进程叫做 postmaster,它监听着一个特定的 TCP/IP 端口等待进来的联接。每当检测到一个联接请求时,postmaster 进程派生出一个新的叫 postgres 的服务器进程。服务器任务(postgres 进程)相互之间使用信号灯共享内存进行通讯,以确保在并行的数据访问过程中的数据完整性。图 \ref{connection} 显示了主进程 postmaster,服务器进程 postgres 和客户端应用之间的相互关系。

客户端进程要么是 psql 前端(用于交互的 SQL 查询)或者是任意用 libpg 库实现的用户应用。请注意用 ecpgPostgres 用于 C 的嵌入 SQL 预处理器)实现的应用同样也使用这个库。

一旦建立起来一个联接,客户端进程就可以向后端服务器进程发送查询了。查询是通过纯文本传输的,也就是说在前端(客户端)不做任何分析处理。服务器分析查询,创建执行规划,执行该规划并且通过已经建立起来的联接把检索出来的记录返回给客户端。