问题描述
连接状态在池中保持 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 (将#修改为@)