Eu tenho um servidor PostgreSQL com pgBouncer como pool de conexões.
Meu aplicativo está sendo executado no Elixir.
Este é o meu arquivo de configuração para pgBouncer:
* = host=X.X.X.X port=5432
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = 0.0.0.0
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admin
pool_mode = transaction
ignore_startup_parameters = extra_float_digits
server_check_query = select 1
server_check_delay = 30
max_client_conn = 10000
default_pool_size = 5
min_pool_size = 3
reserve_pool_size = 3
server_reset_query = DEALLOCATE ALL;
Quando eu uso o pool de transações , estou recebendo este erro:
ERROR 08P01 (protocol_violation) bind message supplies 4 parameters, but prepared statement "ecto_323" requires 2
Então eu mudei para o modo de pool de sessão . Desta vez estou recebendo este erro:
ERROR 26000 (invalid_sql_statement_name) prepared statement "ecto_83" does not exist
Como faço para corrigir isso do pgBouncer?
Quando conecto o banco de dados diretamente, não vi nenhum erro. Estava rodando mais de um ano sem nenhum proxy. Estamos implementando o pgBouncer agora.
O erro no modo de pool de sessão indica que você está fazendo algo diferente que não está conectado ao pgBouncer: se o aplicativo tiver a mesma sessão o tempo todo, a única explicação para uma instrução preparada ausente é que ela nunca foi declarada ou desalocada. Isso deve acontecer da mesma forma sem o pgBouncer.
A máxima aqui é que tudo deve funcionar com o modo de pool de sessão.
O erro com o modo de pool de transações indica que você está usando o mesmo nome de instrução preparada para instruções diferentes. Agora, quando um segmento de aplicativo obtém uma sessão de outro segmento na próxima transação e obtém as instruções preparadas junto com ele, isso não é surpresa.
Com o pool de transações, você deve desabilitar as instruções preparadas no aplicativo, diz o faq