gpt4 book ai didi

postgresql - 准备好的语句不存在

转载 作者:行者123 更新时间:2023-11-29 11:29:28 27 4
gpt4 key购买 nike

目前正在运行一个简单的 sinatra 应用程序,使用 passenger,并使用 pgbouncer 将连接池连接到与该应用程序位于同一服务器上的数据库。目前,我间歇性地收到一个 PG 错误,即准备好的语句“a\d”不存在。

A PG::Error occurred in #: ERROR: prepared statement "a2" does not exist 

错误前执行的ruby代码

def self.get_ownership_record(id, key)  self.where("user_id=? AND key=?", id, key ).first end

pgbouncer 配置

; #########################################################; ############# SECTION HEADER [DATABASES] ################; #########################################################[databases]fakedatabase=fake[pgbouncer]; ----- Generic Settings --------------------------; -------------------------------------------------logfile=/opt/local/var/log/pgbouncer/pgbouncer.logpidfile=/opt/local/var/run/pgbouncer/pgbouncer.pidlisten_addr=*listen_port=5444; unix_socket_dir=/tmpuser=_webuserauth_file=/Users/Shared/data/global/pg_authauth_type=trustpool_mode=transaction; max_client_conn=100; default_pool_size=20; reserve_pool_size=0; reserve_pool_timeout=5; server_round_robin=0; ----- Log Settings ------------------------------; -------------------------------------------------; syslog=0; syslog_ident=pgbouncer; syslog_facility=daemon; log_connections=1; log_disconnections=1; log_pooler_errors=1; ----- Console Access Control --------------------; -------------------------------------------------admin_users=admin,nagios; -------------------------------------------------; server_reset_query=DISCARD ALL; server_check_delay=0 server_check_query=SELECT 1;; server_lifetime=3600; server_idle_timeout=600; server_connect_timeout=600; server_login_retry=15

关闭准备好的语句是我唯一的解决方案吗?

数据库.yml

production:  adapter: postgresql  database: fakedatabase  username: admin  host: localhost  port: 5444  reconnect: true  prepared_statements: false

编辑

我已经更新了 pgbouncer.ini 以使用 session 池

pool_mode=session

未注释

server_reset_query=DISCARD ALL;

而且我似乎仍然随机收到涉及准备好的语句的错误,但这次

An ActiveRecord::StatementInvalid occurred in #: PG::Error: ERROR: bind message supplies 2 parameters, but prepared statement "a1" requires 0 

我已经在我的 postgresql 日志中打开了语句级别的日志记录,如果可能的话,我会报告更多细节。

最佳答案

遵循 Richard Huxton 的建议,并经过反复试验。

我的最终设置看起来像

数据库.yml

必须将 prepared_statements 设置为 true

production:  adapter: postgresql  database: fakedatabase  username: admin  host: localhost  port: 5444  reconnect: true  prepared_statements: true

pgbouncer.ini

必须取消注释 server_reset_query=DISCARD ALL;

并设置pool_mode=session

; #########################################################; ############# SECTION HEADER [DATABASES] ################; #########################################################[databases]fakedatabase=fake[pgbouncer]; ----- Generic Settings --------------------------; -------------------------------------------------logfile=/opt/local/var/log/pgbouncer/pgbouncer.logpidfile=/opt/local/var/run/pgbouncer/pgbouncer.pidlisten_addr=*listen_port=5444; unix_socket_dir=/tmpuser=_webuserauth_file=/Users/Shared/data/global/pg_authauth_type=trustpool_mode=session; max_client_conn=100; default_pool_size=20; reserve_pool_size=0; reserve_pool_timeout=5; server_round_robin=0; ----- Log Settings ------------------------------; -------------------------------------------------; syslog=0; syslog_ident=pgbouncer; syslog_facility=daemon; log_connections=1; log_disconnections=1; log_pooler_errors=1; ----- Console Access Control --------------------; -------------------------------------------------admin_users=admin,nagios; -------------------------------------------------server_reset_query=DISCARD ALL;server_check_delay=0server_check_query=SELECT 1;; server_lifetime=3600; server_idle_timeout=600; server_connect_timeout=600; server_login_retry=15

基本上允许使用默认服务器重置查询在 session 池模式下准备好的语句。

关于postgresql - 准备好的语句不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com