PGBouncer, код сервера, взаимодействующего с Postgresql написан на Go.
Как я понял, PGBouncer не дружит с prepared-stmts, так как они живут в рамках одного соединения (процесса).
Возникает вопрос: возможно ли как-то заморочиться и подготавливать все запросы при создании коннекта PGBouncer'а и отлавливать его завершение? И стоит ли вообще игра свечь?
Проблема стоит достаточно остро, так как многие запросы выполняются, например, 0.001-0.010 ms, а вот подготовливаются 0.150-0.400 ms
Никто Вас не заставляет использовать transaction pooling, кстати. Но то, насколько помогут другие режимы, зависит от того, как приложения обращаются с connections.
В базу летит множество мелких select'ов, и их число постоянно будет расти, поэтому определённо нужен transaction pooling
Я не совсем понял, как "множество мелких select'ов" связано с необходимостью transaction pooling? Важно их распределение по сессиям / транзакциям, нет?
Возможно, я не очень корректно сформулировал. Мне нужен именно transaction pooling mode pgbouncer'а, потому что в базу льётся огромное число запросов от Go'шного сервера и в итоге базе становится плохо (от огромного числа порождаемых процессов). Session pooling, как я понимаю, меня не спасёт, так как при коннекте гошного сервера к БД будет использоваться одно единственное соединение Session Pooling может работать с prepare stms, а вот transaction pooling - нет, как я понял. Видел доклад про режим бинарных параметров в PostgreSQL для запросов с плейсхолдерами и неявной подготовкой запросов, но это не совсем то, как я понял
> БД будет использоваться одно единственное соединение Будет использоваться столько, сколько настроите. И если Вы не сделаете pool из одного соединения, то нет, конечно. Опять-таки, вопрос в том, как клиент с т.з. PostgreSQL распределяет запросы по сессиям. Как "крайний" случай — много мелких запросов могут быть распределены по 10 постоянно активным соединениям, например — и transaction pooling только навредит. Т.е. тут нужно смотреть, как именно Go'шный сервер работает с соединениями.
Внезапно в Go есть пул соединений, который как правило настраивается
То есть я правильно понимаю, что я настрою пул соединений с базой в Go, коннектится он будет к pgbouncer, а тот к postgres??
Работают, но не с transaction pooling.
Нужно настраивать пакет sql https://golang.org/pkg/database/sql/#DB.SetMaxOpenConns и ставить pgbouncer, если несколько приложений смотрят в базу
Обсуждают сегодня