Postgresql pgbouncer-无法连接到服务器:地址已在使用中(0x00002740/10048)
我有一个应用程序使用libpq连接到postgresql server,并使用pgbouncer作为连接池Postgresql pgbouncer-无法连接到服务器:地址已在使用中(0x00002740/10048),postgresql,libpq,pgbouncer,Postgresql,Libpq,Pgbouncer,我有一个应用程序使用libpq连接到postgresql server,并使用pgbouncer作为连接池 if (pconn == nullptr) { pconn = PQconnectdb(chrConnectStr); } if (PQstatus(pconn) == CONNECTION_BAD) { //If it fails, try to connect once pconn = PQconnectdb(c
if (pconn == nullptr) {
pconn = PQconnectdb(chrConnectStr);
}
if (PQstatus(pconn) == CONNECTION_BAD) {
//If it fails, try to connect once
pconn = PQconnectdb(chrConnectStr);
//Make an error if it still fails
if (PQstatus(pconn) == CONNECTION_BAD) {
//Error sometimes occurred here when test with concurrent connection
return S_FALSE;
}
}
.......
//When connection OK, doing SQL execution
//Close connection after finish
PQFinish(pconn);
当我运行一个应用程序实例时,一切都很好。
但是当我同时测试多个实例(大约5个实例)时,有时我会得到连接\u BAD
状态
当时我检查了PQerrorMessage(conn)
,看到了错误消息:
could not connect to server: Address already in use (0x00002740/10048)
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 6543?
这里是pgbouncer配置
[databases]
food = host=127.0.0.1 dbname=MyDB auth_user=MyUser
[pgbouncer]
listen_port = 6543
listen_addr = *
auth_type = md5
auth_file = D:\PostgreSQL\pgbouncer\users.txt
admin_users = MyUser
syslog = 1
default_pool_size = 100
server_reset_query = DEALLOCATE ALL
同样在
postgres.conf
I设置中:max_connections=500
来自man 2 bind
:
EADDRINUSE
(Internet域套接字)端口号在套接字地址结构中指定为零,但在尝试绑定到时 作为临时端口,已确定临时端口范围内的所有端口号当前都在使用中。见讨论 属于
/proc/sys/net/ipv4/ip\u local\u port\u范围
ip(7)
从man 7 ip
:
/proc
接口IP协议支持一组
/proc
接口来配置一些全局参数。这些参数可以通过读取或读取来访问
正在目录/proc/sys/net/ipv4/
中写入文件。描述为布尔型的接口采用一个整数值,并带有一个非零值
(“true”)表示相应的选项已启用,零值(“false”)表示该选项已禁用
[……]
ip\u local\u port\u范围
(从Linux 2.2开始)此文件包含两个整数,用于定义分配给未显式绑定到端口的套接字的默认本地端口范围 端口号,即用于临时端口的范围。在以下情况下,会将临时端口分配给套接字:
- 调用
时,套接字地址中的端口号指定为0bind(2)
在以前未绑定的流套接字上调用listen(2)
- 对以前未绑定的套接字调用了
connect(2)
在以前未绑定的数据报套接字上调用 临时端口的分配从ip_local_port_范围中的第一个数字开始,以第二个数字结束。如果范围 如果临时端口的数量耗尽,则相关的系统调用将返回一个错误(但请参见错误) 请注意,sendto(2)
中的端口范围不应与伪装使用的端口冲突(尽管情况不同) 处理)。此外,任意选择可能会导致某些防火墙数据包过滤器出现问题,这些过滤器假设本地 正在使用的端口。第一个数字应至少大于1024,或更好,大于4096,以避免与油井发生冲突 已知端口,并将防火墙问题降至最低ip_local_port_range