🐘 Postgres использует архитектуру «отдельный процесс на каждое подключение», поэтому в большинстве случаев вам нужен connection pooler.
Пул соединений вставляется между приложением и базой: он держит набор постоянных подключений и динамически назначает их входящим запросам. Самый распространённый инструмент - PgBouncer, у которого есть три режима работы.
1) Session pooling - каждое приложение-подключение закрепляется за одним pooled-соединением.
2) Transaction pooling - каждую транзакцию привязывают к pooled-соединению и освобождают сразу после завершения.
3) Statement pooling - каждое выражение получает соединение, но нет поддержки многозапросных транзакций, что сильно ограничивает кейсы.
Режим 1 плохо решает проблемы высокой конкуренции Postgres, поэтому обычно не подходит при большом числе подключений. Режим 3 слишком ограничивающий, так как многозапросные транзакции нужны многим приложениям. В итоге режим 2 даёт лучший баланс возможностей и контроля над соединениями.
Именно transaction pooling, тот режим, который PlanetScale применяет для всех своих PgBouncer-инстансов.
@sqlhub
Post #2168
5.14K

- 👍 8
- 🔥 4
- ❤ 2