如何解决Postgres 连接状态在发生异常时保持活动状态
连接状态在池中保持 active
,当通过 C# 执行查询或存储过程时有 exception
。
我使用的 Npgsql
版本是 4.1.7
。
这是我要执行的代码。
NpgsqlCommand cmd = null;
NpgsqlDataAdapter sda = null;
NpgsqlConnection conn = null;
try {
string sql = "a_test";
conn = new NpgsqlConnection("Server=localhost;Port=5432;Username=admin;Password=test;Database=majordb;SearchPath=dbs;CommandTimeout=300;MaxPoolSize=500;Connection Idle Lifetime=180;Connection Pruning Interval=5;");
cmd = new NpgsqlCommand(sql);
cmd.CommandType = CommandType.StoredProcedure;
sda = new NpgsqlDataAdapter(cmd);
cmd.Connection = conn;
sda.Fill(dataTable);
}
catch (Exception e) {
//log
}
finally {
if(null != sda)
{
try
{
sda.Dispose();
}
catch (Exception)
{
}
}
try
{
cmd.Connection.Close();
cmd.Connection.Dispose();
}
catch (Exception)
{
}
try
{
cmd.Dispose();
}
catch (Exception)
{
}
}
如果上面的代码正常执行没有任何异常,池中的连接状态就变成了idle
,这是正确的。但是如果在执行时发生异常,如下所示:
"Npgsql.NpgsqlException (0x80004005): Exception while reading from stream --->
System.IO.IOException: Unable to read data from the transport connection: A connection attempt
failed because the connected party did not properly respond after a period of time,or established
connection failed because connected host has failed to respond."
池中的连接状态显示为 active
大约 5 分钟左右,即使 close/dispose
方法在 finally
块中调用。这意味着 close/dispose
没有被 Npgsql
正确执行。如果程序在 5 分钟内运行的每个连接都保持池中的连接状态处于活动状态,则可能存在 MaxPoolSize
错误。
我希望看到 connection
状态变为 idle
,即使出现异常也是如此。我该怎么做。
请注意:我不是在寻找我上面列出的异常的解决方案。我正在寻找一种解决方案,当执行上述代码时出现异常时,连接状态从 idle
更改为 active
。
要知道连接状态是否为 active
,我使用了以下查询:
SELECT
pid,usename,application_name,datname,client_addr,rank() over (partition by client_addr order by backend_start ASC) as rank,state,state_change,current_timestamp,query,query_start,backend_start,FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid( )
AND
application_name !~ '(?:psql)|(?:pgAdmin.+)'
AND
datname = current_database()
AND
usename = current_user
非常感谢任何帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。