准备的语句不存在 [英] Prepared Statement doesn't exist

查看:123
本文介绍了准备的语句不存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 
PG :: Error发生在#:
错误中:预备语句 a2不存在

在错误之前执行的红宝石代码

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

pgbouncer config

 
; ################################################ #######
; ############ SECTION HEADER [DATABASES] ###############
; ################################################ #######

[数据库]

fakedatabase =假

[pgbouncer]

; -----常规设置--------------------------
; -------------------------------------------------
日志文件= / 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

; -----日志设置------------------------------
; -------------------------------------------------
; syslog = 0
; syslog_ident = pgbouncer
; syslog_facility =守护程序
; log_connections = 1
; log_disconnections = 1
; log_pooler_errors = 1

; -----控制台访问控制--------------------
; -------------------------------------------------
admin_users = admin,nagios
; -------------------------------------------------
; server_reset_query =全部取消;
server_check_delay = 0
server_check_query = SELECT 1;
; server_lifetime = 3600
; server_idle_timeout = 600
; server_connect_timeout = 600
; server_login_retry = 15

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



database.yml

 
生产:
适配器:postgresql
数据库:fakedatabase
用户名:admin
主机:localhost
端口:5444
重新连接:true
prepare_statements:false

编辑



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



pool_mode = session



和未注释的



server_reset_query = DISCARD ALL;



我似乎仍然在随机获取涉及准备好的语句的错误,但这一次

 
ActiveRecord :: StatementInvalid发生在#:

PG :: Error:错误:绑定消息提供2个参数,但准备了语句 a1要求0

我已经在postgresq中打开了语句级别的日志记录l将记录日志并在可能的情况下提供更多详细信息。

解决方案

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

我的最终设置如下



database.yml



必须将 prepared_statements 设置为 true

 
生产:
适配器:postgresql
数据库:fakedatabase
用户名:admin
主机:localhost
端口:5444
重新连接:真
prepare_statements:真

pgbouncer。 ini



必须取消注释 server_reset_query = DISCARD ALL;



并设置 pool_mode = session

 
; ################################################ #######
; ############ SECTION HEADER [DATABASES] ###############
; ################################################ #######

[数据库]

fakedatabase =假

[pgbouncer]

; -----常规设置--------------------------
; -------------------------------------------------
日志文件= / 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 = session
; max_client_conn = 100
; default_pool_size = 20
; reserve_pool_size = 0
; reserve_pool_timeout = 5
; server_round_robin = 0

; -----日志设置------------------------------
; -------------------------------------------------
; syslog = 0
; syslog_ident = pgbouncer
; syslog_facility =守护程序
; log_connections = 1
; log_disconnections = 1
; log_pooler_errors = 1

; -----控制台访问控制--------------------
; -------------------------------------------------
admin_users = admin,nagios
; -------------------------------------------------
server_reset_query =全部取消;
server_check_delay = 0
server_check_query = SELECT 1;
; server_lifetime = 3600
; server_idle_timeout = 600
; server_connect_timeout = 600
; server_login_retry = 15

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


Currently running a simple sinatra app, using passenger, and using pgbouncer for connection pooling to a database on the same server as the app. Currently I am intermittently getting a PG error that the prepared statement "a\d" doesn't exist.

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

the ruby code that is executed before the error

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

pgbouncer config

; #########################################################
; ############# 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

Is my only solution, to turn off prepared statements?

database.yml

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

EDIT

I have updated the pgbouncer.ini to use session pooling

pool_mode=session

and uncommented

server_reset_query=DISCARD ALL;

and I am still seemingly, randomly getting errors involving prepared statements, but this time

An ActiveRecord::StatementInvalid occurred in #: 

PG::Error: ERROR: bind message supplies 2 parameters, but prepared statement "a1" requires 0 

I have turned on statement level logging in my postgresql logs and will report back with more details if possible.

解决方案

follwing Richard Huxton advice, and after some trial and error.

my final setup looks like

database.yml

had to set prepared_statements to true

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

pgbouncer.ini

had to uncomment server_reset_query=DISCARD ALL;

and set pool_mode=session

; #########################################################
; ############# 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=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=0
server_check_query=SELECT 1;
; server_lifetime=3600
; server_idle_timeout=600
; server_connect_timeout=600
; server_login_retry=15

basically allow prepared statements in a session pool mode with the default server reset query.

这篇关于准备的语句不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆