目前正在运行一个简单的 sinatra 应用程序,使用乘客,并使用 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.log
pidfile=/opt/local/var/run/pgbouncer/pgbouncer.pid
listen_addr=*
listen_port=5444
; unix_socket_dir=/tmp
user=_webuser
auth_file=/Users/Shared/data/global/pg_auth
auth_type=trust
pool_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
EDIT
我已更新 pgbouncer.ini 以使用会话池
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 日志中打开了语句级别日志记录,如果可能的话,我将报告更多详细信息。