Déclarations préparées avec pgBouncer
J'ai un serveur PostgreSQL avec pgBouncer comme pooler de connexion.
Mon application fonctionne sur Elixir.
Voici mon fichier de configuration pour 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;
Lorsque j'utilise le regroupement de transactions, j'obtiens cette erreur:
ERROR 08P01 (protocol_violation) bind message supplies 4 parameters, but prepared statement "ecto_323" requires 2
Ensuite, je l'ai changé en mode de regroupement de sessions . Cette fois, j'obtiens cette erreur:
ERROR 26000 (invalid_sql_statement_name) prepared statement "ecto_83" does not exist
Comment résoudre ce problème depuis pgBouncer?
Lorsque je connecte directement la base de données, je n'ai vu aucune erreur. Il fonctionnait plus d'un an sans proxy. Nous implémentons pgBouncer maintenant.
Réponses
L'erreur en mode de regroupement de sessions indique que vous faites quelque chose de différent qui n'est pas connecté à pgBouncer: si l'application a la même session tout le temps, la seule explication d'une instruction préparée manquante est qu'elle n'a jamais été déclarée ou désallouée. Cela devrait se produire de la même manière sans pgBouncer.
La maxime ici est que tout devrait fonctionner avec le mode de regroupement de sessions.
L'erreur avec le mode de regroupement de transactions indique que vous utilisez le même nom d'instruction préparée pour différentes instructions. Maintenant, lorsqu'un thread d'application obtient une autre session de thread dans la transaction suivante, et qu'il obtient les instructions préparées avec elle, ce n'est pas une surprise.
Avec le regroupement de transactions, vous devez désactiver les instructions préparées dans l'application, indique la FAQ