Mar*_*cus 5 .net c# postgresql entity-framework npgsql
我从这个 - SemaphoreSlim 开始,以保护连接池免遭耗尽,并很快意识到我的问题是,当我处置 DbContext 时,连接不会返回到池中。
考虑到数据库的所有连接都是在 using 语句中完成的,如下所示:
using (var context = ContextFactory.GetContext<PostgreSqlDatabaseContext>(connectionString))
{
var query = $"SELECT * FROM public.\"MyTable\" WHERE \"MyId\" = '{id}'";
var result = await context.MyTable.FromSql(query).SingleOrDefaultAsync();
return result;
}
Run Code Online (Sandbox Code Playgroud)
看起来ContextFactory像这样:
internal class ContextFactory
{
public static T GetContext<T>(string sqlConnection) where T : DbContext
{
var optionsBuilder = new DbContextOptionsBuilder<PostgreSqlDatabaseContext>();
optionsBuilder.UseNpgsql(sqlConnection);
return new PostgreSqlDatabaseContext(optionsBuilder.Options) as T;
}
}
Run Code Online (Sandbox Code Playgroud)
无论我如何处理连接字符串、Enlist=true按照此处建议的设置,或者按照此处SemaphoreSlim建议的方式限制连接,我都会得到相同的结果:
连接池已耗尽,请提高 MaxPoolSize(当前为 20)或超时(当前为 15 秒)
有Npgsql作用吗?这里发生了什么?