Postgresql pgbouncer-无法连接到服务器:地址已在使用中(0x00002740/10048)

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

我有一个应用程序使用libpq连接到postgresql server,并使用pgbouncer作为连接池

    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开始)
此文件包含两个整数,用于定义分配给未显式绑定到端口的套接字的默认本地端口范围 端口号,即用于临时端口的范围。在以下情况下,会将临时端口分配给套接字:

  • 调用
    bind(2)
    时,套接字地址中的端口号指定为0

  • listen(2)
    在以前未绑定的流套接字上调用

  • 对以前未绑定的套接字调用了
    connect(2)

  • sendto(2)
    在以前未绑定的数据报套接字上调用

    临时端口的分配从ip_local_port_范围中的第一个数字开始,以第二个数字结束。如果范围 如果临时端口的数量耗尽,则相关的系统调用将返回一个错误(但请参见错误)

    请注意,
    ip_local_port_range
    中的端口范围不应与伪装使用的端口冲突(尽管情况不同) 处理)。此外,任意选择可能会导致某些防火墙数据包过滤器出现问题,这些过滤器假设本地 正在使用的端口。第一个数字应至少大于1024,或更好,大于4096,以避免与油井发生冲突 已知端口,并将防火墙问题降至最低

在我看来,你的临时港口快用完了。你有那么多的联系吗?也许增加短暂的港口范围会有所帮助