Pet*_*ete 6 postgresql postgresql-9.2 pgbouncer
我有 Postgres 9.2 和 PgBouncer('stack builder' 附带的版本)。我有一个通过 Npgsql 2.0.12 版在 win7 机器上连接的 .net 应用程序。
我的应用程序可以直接连接到 postgres 服务器,但总是无法通过 pgbouncer 连接。
我到 npgsql 的连接字符串(经过一些替换)
Sslmode=Prefer;Timeout=40;Server={0};Port={3};User Id={4};Password={1};Database={2};Pooling=False;
Run Code Online (Sandbox Code Playgroud)
(我也尝试过使用 Protocol=3 显式连接到 PgBounce,但没有奏效。)
pgBounce ini 的数据库行是:
[databases]
something = host=localhost port=5433 dbname=somethingelse user=someone password=aaa
Run Code Online (Sandbox Code Playgroud)
在 userlist.txt 中,我根据需要有“某人”“aaa”。
当我的应用程序运行时,npgsql 显示“连接被强制关闭”并且 pgbouncer 错误日志显示:
2013-02-06 20:16:57.594 2444 LOG File descriptor limit: -1 (H:-1), max_client_conn: 1000, max fds possible: 1030
2013-02-06 20:16:57.649 2444 LOG listening on ::/6433
2013-02-06 20:16:57.657 2444 LOG listening on 0.0.0.0:6433
2013-02-06 20:16:57.659 2444 LOG process up: pgbouncer 1.5.2, libevent 2.0.19-stable (win32), adns: evdns2
2013-02-06 20:17:22.066 2444 LOG C-01819410: something/someone@fe80::997b:396e:eacc:dd2b:3013 login attempt: db=somethingelse user=someone
2013-02-06 20:17:22.130 2444 LOG S-01836648: something/someone@127.0.0.1:5433 new connection to server
2013-02-06 20:17:24.069 2444 LOG C-01819410: something/someone@fe80::997b:396e:eacc:dd2b:3013 closing because: client close request (age=2)
2013-02-06 20:17:26.319 2444 LOG C-01819410: (nodb)/(nouser)@fe80::997b:396e:eacc:dd2b:3023 closing because: bad packet header (age=0)
2013-02-06 20:17:26.322 2444 WARNING C-01819410: (nodb)/(nouser)@fe80::997b:396e:eacc:dd2b:3023 Pooler Error: bad packet header
Run Code Online (Sandbox Code Playgroud)
npgsql 异常说:(从应用程序中的日志文件中,最上面的异常跟随嵌套异常):
Exception message: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.
Exception source: Npgsql
Exception stacktrace: at Npgsql.NpgsqlClosedState.Open(NpgsqlConnector context) in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlClosedState.cs:line 232
at Npgsql.NpgsqlConnector.Open() in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlConnector.cs:line 695
at Npgsql.NpgsqlConnectorPool.GetNonPooledConnector(NpgsqlConnection Connection) in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlConnectorPool.cs:line 346
at Npgsql.NpgsqlConnectorPool.RequestConnector(NpgsqlConnection Connection) in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlConnectorPool.cs:line 185
at Npgsql.NpgsqlConnection.Open() in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlConnection.cs:line 543
at *snip* the thing in my code that goes and opens the connection *snip*
-----------------------------------------------------
Exception message: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.
Exception source: System
Exception stacktrace: at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.Stream.ReadByte()
at Npgsql.NpgsqlClosedState.Open(NpgsqlConnector context) in Z:\Projectdirectory\Npgsql2.0.12.0.src\src\Npgsql\NpgsqlClosedState.cs:line 184
-----------------------------------------------------
Exception message: An established connection was aborted by the software in your host machine
Exception source: System
Exception stacktrace: at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
Run Code Online (Sandbox Code Playgroud)
此外,窗口防火墙已关闭,我暂时关闭了防病毒功能。
postgres 的 HBA 配置文件有:
host all all 127.0.0.1/32 md5
host all all 192.168.0.1/16 md5
# IPv6 local connections:
host all all ::1/128 md5
host all all fe80::1/16 md5
Run Code Online (Sandbox Code Playgroud)
我已经谷歌搜索并没有找到解决方案。帮助!谢谢。
彼得。
userlist.txt 文件包含用于从您的客户端连接到PgBouncer 的帐户。该[databases]部分包含从PgBouncer连接到后端 PostgreSQL 服务器的登录信息。你似乎把这两者混为一谈了。
当您从客户端连接到 PgBouncer 时,您需要提供来自 userlist.txt 的用户名和密码以及something在这种情况下的数据库名称。
啊! 该死!我找到了答案。
我的连接字符串有 SslMode=Prefer
我删除了这个,瞧!pgBouncer 工作了!!我的连接字符串现在是:
Timeout=40;Server={0};Port={3};User Id=someone;Password={1};Database={2};Pooling=False;Protocol=3;
Run Code Online (Sandbox Code Playgroud)
感谢大家的时间和努力。