![](/img/trans.png)
[英]postgres listen notification generates error - 53300: sorry, too many clients already
[英]PostgreSQL: Load testing throws error - Npgsql.PostgresException: '53300: sorry, too many clients already'
我有一个简单的代码试图模拟我的 Postgres 数据库的负载测试
List<Values> values = new List<Values>();
for (int i = 0; i < 200; i++)
{
var mythread = new Thread(() =>
{
DatabaseConnection db = new DatabaseConnection();
using (var conn = db.GetDatabaseConnection())
{
var cmd = new NpgsqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT val.id, val.name FROM val.myvalue val";
cmd.Prepare();
var reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
Values value = new Values();
value.Id = reader.GetInt64(0);
value.Name = reader.GetString(1);
values.Add(value);
}
reader.Close();
}
catch (Exception ex)
{
reader.Close();
var exception = ex;
throw exception;
}
}
});
mythread.Start();
}
但是当我运行它时,我收到错误Npgsql.PostgresException: '53300: 抱歉,已经有太多客户端'
数据库连接 class
public class DatabaseConnection
{
public NpgsqlConnection GetDatabaseConnection()
{
var connectionstring = "User ID=myuser;Password=mypassword;Server=localhost;Port=5432;Database=myvaluesdb;Pooling=True;Minimum Pool Size=10;Maximum Pool Size=100;Trust Server Certificate=true;Connection Idle Lifetime=300;keepalive=10;Timeout=60";
NpgsqlConnection connection = null;
try
{
connection = new NpgsqlConnection(connectionstring);
connection.Open();
}
catch (Exception)
{
// try to reconnect
connection = new NpgsqlConnection(connectionstring);
connection.Open();
}
if (connection.State == ConnectionState.Open)
Console.WriteLine("connection status = OPEN");
else
{
var exception = new Exception("could not get DB connection");
throw exception;
}
return connection;
}
}
检查 max_connections 显示 100
所以我的问题是这是正常的还是有什么地方做错了需要纠正如果是这样我该如何纠正
谢谢
如果您执行的查询很短(即完成时间少于 60 秒),您应该不会看到此行为。
当达到最大连接数(最大池大小)并且您要求更多连接时,npgsql 将等待timeout
(在您的情况下为 60 秒,默认为 15 秒)返回一个。 它不会建立更多,但它会等待另一个连接停止使用并返回到池中。
在您的示例中,您同时启动了 200 个线程。 前 100 个应该没有问题,然后接下来的 100 个应该等待前 100 个将连接返回到池中,然后可以建立/使用他们的连接。
因此,要么您正在运行的查询非常长(超过 60 秒),要么您在完成后未能关闭连接。 我没有看到任何close
语句,所以你依赖于连接dispose
,但这是自定义代码......你的自定义dispose()
必须明确关闭(或处置)底层连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.