Postgresql pgbouncer错误:关闭原因:客户端意外eof(年龄=0)

Postgresql pgbouncer错误:关闭原因:客户端意外eof(年龄=0),postgresql,go,go-gorm,pgbouncer,Postgresql,Go,Go Gorm,Pgbouncer,我的项目是用golang编写的,我使用postgresql数据库并使用pgbouncer作为数据库池连接。完成基本功能后,我进行了压力测试 它与命令测试运行良好(仅1个并发): 但是当我 增加并发性: ab -n 1000 -c 1 -p '/home/mwh/postfile.txt' -T 'application/x-www-form-urlencoded' 'http://192.168.1.229:8090/hwSdk/tsk/get_t_k.json' ab -n 10000 -c

我的项目是用golang编写的,我使用postgresql数据库并使用pgbouncer作为数据库池连接。完成基本功能后,我进行了压力测试

它与命令测试运行良好(仅1个并发):

但是当我 增加并发性:

ab -n 1000 -c 1 -p '/home/mwh/postfile.txt' -T 'application/x-www-form-urlencoded' 'http://192.168.1.229:8090/hwSdk/tsk/get_t_k.json'
ab -n 10000 -c 100 -p '/home/mwh/postfile.txt1 -T 'application/x-www-form-urlencoded' 'http://192.168.1.229:8090/hwSdk/tsk/get_t_k.json'
应用程序日志中的数据库查询出现错误:

[2017-06-01 12:04:00]  (pq: bind message supplies 18 parameters, but prepared statement "" requires6) 
[2017-06-01 12:04:00]  (pq: bind message supplies 19 parameters, but prepared statement "" requires 3) 
在pgbouncer.log文件中

8035 2017-06-01 12:04:01.702 45619 LOG C-0xf9a4c0: cygnus/cygnus@192.168.1.229:40397 closing because: client close request (age=0)
8036 2017-06-01 12:04:01.703 45619 LOG C-0xf8b9f0: cygnus/cygnus@192.168.1.229:40406 closing because: client close request (age=0)
8037 2017-06-01 12:04:01.703 45619 LOG C-0xf8b248: cygnus/cygnus@192.168.1.229:40574 login attempt: db=cygnus user=cygnus tls=no
8038 2017-06-01 12:04:01.703 45619 LOG C-0xf8c198: cygnus/cygnus@192.168.1.229:40468 closing because: client close request (age=0
8039 2017-06-01 12:04:01.703 45619 LOG C-0xfac6f0: cygnus/cygnus@192.168.1.229:40504 closing because: client close request (age=0)
8040 2017-06-01 12:04:01.707 45619 LOG C-0xf9e698: cygnus/cygnus@192.168.1.229:40235 closing because: client unexpected eof (age=0)
my pgbouncer.ini设置:

pool_mode = Transaction
listen_port = 6543
listen_addr = *
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /tmp/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
stats_users = readonly,cygnus
max_client_conn = 2000
default_pool_size = 400
ignore_startup_parameters = extra_float_digits

问题出在哪里?

如果您在PgBouncer中使用事务模式,则必须将
binary\u parameters=yes
设置到数据库dsn连接中

问题必须出在您的代码、go或它使用的驱动程序中,因为PostgreSQL抱怨语句中的参数数量与提供的参数数量不同。可能是不同的线程使用相同的连接,但同步错误吗?我设置了pool_mode=Session,问题不再发生。但我仍然混淆了事务和Session之间的区别。可能是因为您的代码在环境方面不了解事务,当您在PgBouncer中使用事务模式时。在单线程上工作的原因是您序列化了会话的执行。您可以在会话模式下尝试pool_模式来验证此理论。