Пулы соединений

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

В течение долгого времени пулы соединений рассматривались исключительно как внешнее решение (например, pgbouncer или pgpool), но внешние пулы имеют ограничения. Например, в режиме сессии/транзакции преимущества пулов ограничены: каждая активная сессия/транзакция по-прежнему нуждается в отдельном бэкэнде. В режиме statement необходимо больше усилий, чтобы поддерживать все соединения в корректном состоянии, в противном случае можно столкнуться с ситуацией, когда используемый подготовленный запрос не найден системой либо у параметра GUC неправильное значение.

Хорошим решением проблемы пулов соединений была бы встроенная пулинговая система, гарантирующая, что все пользовательские сессии будут всегда работать так же, как при разделенных бэкэндах. Однако это решение потребует существенных изменений в инфраструктуре, таких как хранение состояния сессии в совместно используемой памяти.