我有一个以PostgreSQL服务器为连接池的pgBouncer服务器。
我的应用程序运行在Elixir上。
这是我的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;当我使用事务池时,我得到了以下错误:
ERROR 08P01 (protocol_violation) bind message supplies 4 parameters, but prepared statement "ecto_323" requires 2然后,我将其更改为会话池模式。这一次我得到了一个错误:
ERROR 26000 (invalid_sql_statement_name) prepared statement "ecto_83" does not exist如何从pgBouncer修复这个问题?
当我直接连接数据库时,我没有看到任何错误。它在没有任何代理的情况下运行了一年多。我们现在正在实施pgBouncer。
发布于 2020-08-25 12:27:24
会话池模式中的错误表示您正在执行一些与pgBouncer没有连接的不同的操作:如果应用程序一直都有相同的会话,则丢失准备语句的唯一解释是它要么从未被声明,要么没有被释放。在没有pgBouncer的情况下,这种情况也应该发生。
这里的格言是,所有东西都应该与会话池模式一起工作。
事务池模式的错误指示您对不同的语句使用相同的准备语句名。现在,当应用程序线程在下一个事务中获得其他线程的会话时,它会同时获得准备好的语句,这并不奇怪。
发布于 2020-08-25 12:52:39
使用事务池,您应该禁用应用程序中已准备好的语句,常见问题说
https://dba.stackexchange.com/questions/274307
复制相似问题