You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连续调用两个PostgreSQL数据查询方法时Npgsql抛出TimeoutException的问题求助

连续调用两个PostgreSQL数据查询方法时Npgsql抛出TimeoutException的问题求助

大家好,我最近用Npgsql操作PostgreSQL数据库时碰到了个诡异的超时问题,想请各位帮忙分析下原因或者给点解决思路。

问题场景

我写了两个异步方法从数据库取数据,调用逻辑大致是这样的:

SomeClass.cs

public static IDatabaseProvider DatabaseProvider { get; } = new PgDatabaseProvider();

public async Task Refresh()
{
    var users = await DatabaseProvider.GetUsersAsync();
    var profiles = await DatabaseProvider.GetProfilesAsync();
}

PgDatabaseProvider.cs

private NpgsqlDataSource _dataSource;

public PgDatabaseProvider()
{
    // 从连接字符串初始化NpgsqlDataSource
    _dataSource = ...;
}

public async Task<IEnumerable<User>> GetUsersAsync()
{
    var results = new List<User>();
    string query = "SELECT * FROM users";
    
    await using (var connection = await _dataSource.OpenConnectionAsync())
    await using (var cmd = new NpgsqlCommand(query, connection))
    await using (var reader = await cmd.ExecuteReaderAsync())
    {
        while (await reader.ReadAsync())
        {
            // 读取数据并封装成User对象加入列表
            results.Add(new User(...));
        }
    }
    
    return results;
}

public async Task<IEnumerable<Profile>> GetProfilesAsync()
{
    // 和GetUsersAsync结构完全一致,只是查询表和返回实体不同
    ...
}

问题现象

  • 单独调用GetUsersAsync()或GetProfilesAsync()时,都能正常返回数据,没有任何异常;
  • 但在Refresh()里连续调用两个方法时,第二个方法刚执行到await cmd.ExecuteReaderAsync()就会抛出TimeoutException;
  • 不管调换两个方法的调用顺序,第二个被调用的方法都会触发这个超时问题。

我试过的操作和疑惑

我知道Npgsql默认用连接池,这些都是虚拟连接,用完会归还到池里复用。我试过在两个方法调用中间执行NpgsqlConnection.ClearAllPools(),但问题还是没解决。

我本来怀疑是资源没释放,但两个方法里的connection、cmd、reader都用了await using,应该会自动释放资源才对。而且查询的数据量很小——一个返回400条左右,一个返回150条左右,每条也就3个字符串字段,应该不会是内存或者查询性能的问题。

有没有大佬能帮忙分析下底层可能出了什么问题,或者我还可以尝试哪些解决办法?


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:33:00