我们有一个ASP.NET核心3.1 REST API,在过go 的5年里已经成功运行了.它在SQLite数据库上使用EF Core 5.1.
我们现在正在从SQLite迁移到AWS Aurora Postgres的过程中.
考虑到这一点,我们添加了Npgsql.EntityFrameworkCore.PostgresSQL Nuget包,并将连接字符串修改为类似以下内容:
"Host=[Our AWS host]; Port=5432; User ID=postgres; Password=XXXXXXXX; Database=api_test_db"
我们有一套针对API运行的集成测试.当连接到SQLite数据库时,它们都成功运行. 然而,当对postgres运行时,它们在运行了大约20个测试后开始失败,并出现以下错误:
连接池已用完,请提高MaxPoolSize(当前为100)或超时(当前为15秒)
我try 通过添加"Pooling=false"来更改连接字符串,但结果是相同的错误. 然后我试着go 掉"Pooling=false"个,然后添加"Maximum Pool Size = 200"个(甚至更多).同样,也会导致相同的错误.
由于这些更改没有任何影响,我怀疑EF不知何故没有使用我认为的连接字符串,所以我故意将连接字符串的数据库元素更改为一个不存在的数据库名称,并立即失败.从而证明正在使用正确的连接字符串.
关于我们使用EF核心需要注意的其他事项:
我们将IContext接口注入到我们的服务中,而不是注入具体的DbContext类.
我们将接口注册到服务集合,如下所示:
services.AddScoped<IContext>(serviceProvider =>
{
var connectionString = "...";
var context = new Context(connectionString);
return context;
});
Context类如下所示:
public class Context : DbContext, IContext
{
...
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (_connectionString.ToLower().Contains("sqlite"))
{
optionsBuilder.UseSqlite(_connectionString,
options => options.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery));
}
else
{
optionsBuilder.UseNpgsql(_connectionString,
options => options.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery))
}
}
}
正如我所说的,这个代码库已经成功地针对SQLite工作了很多年.但当然,与Npgsql不同,SQLite没有池化的概念.
我已经阅读了Postgres Npgsql Connection Pooling篇和其他相关的so帖子,但都想不出这个问题.
知道我们做错了什么吗?