Существует хороший список ограничений PgBouncer для PostgreSQL Wiki .SET
находится в этом списке.
Предполагая, что вы хотите pool_mode = transaction
в PgBouncer - это наиболее разумный режим, и у вас есть некоторый код приложения, зависящий от настроек сеанса (например, search_path
), единственный способ сохранить состояние сеанса - это использовать транзакции.
Если ваше приложение просто создает соединение с PgBouncer, запускает на нем SET search_path TO us
, а затем запускает несколько SELECT - это не будет работать.
Все это легко доказать - просто подключитесь с помощью psql к PgBouncer и используйте команду SET:
(postgres.example.com:6432) prod=# SET client_min_messages TO debug;
SET
(postgres.example.com:6432) prod=# SHOW client_min_messages ;
client_min_messages
---------------------
notice
(1 row)
Как мы видим, состояние сеанса не сохраняется.Вам нужна транзакция:
(postgres.example.com:6432) prod=# begin;
BEGIN
(postgres.example.com:6432) prod=# SET client_min_messages TO debug;
SET
(postgres.example.com:6432) prod=# SHOW client_min_messages ;
client_min_messages
---------------------
debug
(1 row)
(postgres.example.com:6432) prod=# COMMIT;
COMMIT
Другими словами - чтобы включить пул транзакций, транзакции должны быть без состояний - точно так же, как HTTP-запросы, которые переносят всю информацию о состоянии внутри (вформа файлов cookie, идентификаторы сеанса и т. д.).
Очевидно, что в вашем случае это означает внесение изменений в код приложения.Добавление «обертки» вокруг каждого звонка.Это довольно уродливо, и если вам нужно пойти по этому пути, попробуйте переписать приложение, чтобы использовать явный код страны в качестве столбца параметра или базы данных.