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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...