连续调用两个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
相关产品推荐
相关产品推荐

