44.2. 连接是如何建立起来的

PostgreSQL 是用一个简单的"每用户一进程"的"process per user"模型实现的。 在这种模式里一个客户端进程(client process) 只与恰好一个服务器进程(server process)连接。 因为不知道具体要建立多少个连接,所以不得不利用一个主进程(master process) 在每次连接请求时派生出一个新的服务器进程来 这个主进程叫做postgres, 它监听着一个特定的 TCP/IP 端口等待进来的连接。 每当检测到一个连接请求时,postgres进程派生出一个新的服务器进程。 服务器进程之间使用信号灯(semaphores) 和共享内存(shared memory)进行通讯, 以确保在并发的数据访问过程中的数据完整性。 在这种模式里一个客户端进程只与恰好一个服务器进程连接。因为不知道具体要建立多少个连接,所以不得不利用一个主进程在每次连接请求时派生出一个新的服务器进程来。这个主进程叫做 postgres ,它监听着一个特定的 TCP/IP 端口等待进来的连接。每当检测到一个连接请求时,postgres 进程派生出一个新的服务器进程。服务器进程之间使用信号灯和共享内存进行通讯,以确保在并发的数据访问过程中的数据完整性。

客户端进程可以是任何理解 PostgreSQL 协议(在Chapter 46描述)的程序。 许多客户端都是基于 C 语言库libpq的程序, 但是也存在几个对协议之独立的实现,比如 JavaJDBC驱动。

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