Перейти к основному содержимому

Как устанавливаются соединения

PostgreSQL реализует клиент-серверную модель «процесс на пользователя». В этой модели каждый клиентский процесс подключается ровно к одному процессу бэкенда. Поскольку мы не знаем заранее, сколько соединений будет сделано, нам приходится использовать «процесс-куратор», который порождает новый процесс бэкенда каждый раз, когда запрашивается соединение. Этот супервизорный процесс называется postmaster и прослушивает указанный TCP/IP-порт на предмет входящих соединений. Всякий раз, когда он обнаруживает запрос на соединение, он порождает новый процесс backend. Эти внутренние процессы взаимодействуют друг с другом и с другими процессами экземпляра СУБД, используя семафоры и разделяемую память, чтобы обеспечить целостность данных при одновременном доступе к ним.

Клиентским процессом может быть любая программа, понимающая протокол PostgreSQL, описанный в разделе «Протокол Frontend/Backend». Многие клиенты основаны на библиотеке libpq, написанной на языке Си, но существует и несколько независимых реализаций протокола, например драйвер Java JDBC.

После установления соединения клиентский процесс может отправить запрос бэкэнд-процессу, к которому он подключен. Запрос передается в виде обычного текста, т. е. в клиенте не выполняется никакого синтаксического анализа. Бэкэнд-процесс анализирует запрос, создает план выполнения, выполняет его и возвращает клиенту повторно обработанные строки, передавая их по установленному соединению.