# Управляющие подключениями

# PgBouncer

В PostgreSQL для обработки каждого соединения клиента создается отдельный процесс. Чем больше число соединений, тем больше процессов, которые используют оперативную память. Максимальное число соединений с процессом PostgreSQL определяется параметром `max_connections`.

Чтобы оптимизировать потребление ресурсов, можно использовать управляющего соединениями. Клиенты подключаются не напрямую к PostgreSQL, а к управляющему соединениями. При этом поддерживается небольшое количество соединений между управляющим и сервером PostgreSQL — управляющий создает новое соединение или повторно использует одно из существующих. Количество соединений между управляющим и базой данных на каждой из узлов кластера определяется размером пула (параметр `pool_size`).

## Размер пула (pool\_size)<span class="docs-kit__heading__tooltip">⁠</span>

Размер пула (параметр `pool_size`) — это максимальное число соединений между управляющим соединениями и каждой базой данных PostgreSQL на каждом из узлов кластера.

## Режимы подключения

PgBouncer поддерживает три режима подключения:

- режим транзакции (transaction);
- режим сессии (session);
- режим оператора (statement).

### Режим транзакций (transaction)⁠

Соединение с PostgreSQL поддерживается до тех пор, пока не завершится транзакция. Когда транзакция завершается, управляющий соединениями возвращает соединение в пул. Позже это соединение может повторно использоваться этим же клиентом для других подключений или другим клиентом.

Общее количество клиентских подключений к PgBouncer может достигать 10 000, но количество активных транзакций определяет размер пула. Например, если размер пула равен 30, то активных транзакций будет 30.

Количество соединений между управляющим соединениями и каждой базой данных PostgreSQL на каждом из узлов кластера также определяется размером пула.

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

Режим транзакции снижает нагрузку на ресурсы СУБД, если есть большое количество клиентских подключений с низкой нагрузкой.

<figure class="docs-kit__img-wrapper" id="bkmrk-">![](https://423.selcdn.ru/kb/cp.transaction_pooling_mode.pkdcnu.png)</figure>### Ограничения режима transaction<span class="docs-kit__heading__tooltip">⁠</span>

Режим transaction нарушает работу некоторых механизмов PostgreSQL. Выберите другой режим, если клиенты используют эти опции. Некоторые флаги подключения могут распределяться между разными клиентами — это может привести к непредсказуемому поведению и некорректным результатам.

В режиме transaction не работают:

- команды [SET/RESET](https://www.postgresql.org/docs/current/sql-reset.html) и [LISTEN/NOTIFY](https://www.postgresql.org/docs/current/sql-listen.html);
- [WITH HOLD CURSOR](https://www.postgresql.org/docs/current/sql-declare.html);
- [PRESERVE/DELETE ROWS](https://www.postgresql.org/docs/current/sql-createtable.html) во временных таблицах;
- подготовленные операторы (prepared statements): protocol-level prepared plans, [PREPARE](https://www.postgresql.org/docs/current/sql-prepare.html), [DEALLOCATE](https://www.postgresql.org/docs/current/sql-deallocate.html);
- оператор [LOAD](https://www.postgresql.org/docs/14/sql-load.html);
- рекомендательные блокировки [Session-level advisory locks](https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY-LOCKS).

Подробнее о [несовместимых опциях](https://www.pgbouncer.org/features.html#fnref:2) в документации PgBouncer.

## Режим сессии (session)<span class="docs-kit__heading__tooltip">⁠</span>

В режиме сессии клиент может продолжать отправлять запросы до тех пор, пока продолжается сессия — соединение между управляющим соединениями и сервером PostgreSQL будет поддерживаться до отключения клиента от базы данных.

Количество подключений между управляющим соединениями и сервером PostgreSQL определяется [размером пула](https://docs.nix-adm.ru/link/103#bkmrk-%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80-%D0%BF%D1%83%D0%BB%D0%B0-%28pool_si). На каждое подключение клиента используется подключение между управляющим соединениями и сервером PostgreSQL. Соединение возвращается в пул и может быть повторно использовано только после отключения предыдущего клиента от базы данных.

В отличие от режима транзакции (transaction), этот режим безопасен, повторяет прямое подключение к PostgreSQL, поддерживает все механизмы и подходит для всех клиентов PostgreSQL. При использовании этого режима нагрузка на ресурсы не снижается.

Этот режим соединений полезен для клиентов, у которых много короткоживущих подключений к базе данных, потому что в таком режиме увеличивается скорость подключения к СУБД.

![image.png](https://docs.nix-adm.ru/uploads/images/gallery/2024-06/scaled-1680-/image.png)

## Режим оператора (statement)<span class="docs-kit__heading__tooltip">⁠</span>

Управляющий подключениями вернет соединение в пул, как только будет обработан первый запрос — транзакции с несколькими операторами прервутся, управляющий подключениями вернет ошибку.

Этот режим позволяет использовать больше клиентских подключений, чем в режиме транзакции. Режим подойдет, если известно, что каждая транзакция ограничена только одним запросом (включен режим AUTOCOMMIT).

![image.png](https://docs.nix-adm.ru/uploads/images/gallery/2024-06/scaled-1680-/ikzimage.png)

## Список используемых источников

- [Серверные приложения: pgbouncer](https://postgrespro.ru/docs/postgrespro/15/pgbouncer)