我们有一个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帖子,但都想不出这个问题.

知道我们做错了什么吗?

推荐答案

我采纳了S的建议,构建了一个最小的程序,并按照他的建议找到了问题所在.

结果是,我们的API中有一些中间件来判断SQLite数据库文件或Postgres数据库是否存在,这取决于API应该针对哪个数据库来处理该请求.在Postgres的情况下,我们打开了一个到数据库的连接,并且从未关闭它.这意味着连接对象永远不会返回到池中,因此在100个连接之后,池将耗尽,并且我们的API无法处理该请求.

感谢大家的建议.特别感谢@Shay Rojansky在EF和NpgSql上所做的所有伟大工作.

Postgresql相关问答推荐

创建发布性能

Select 二维数组中的特定元素PostgreSQL

列不明确

如何在postgres中测试锁定

如何使 Postgres 优化引擎具有确定性

为什么不能超过 10 个并发连接到 Postgres RDS 数据库

Spring:如何在 PostgreSQL 中使用 KeyHolder

我可以使用 Rails 将数组存储在 hstore 中吗

是否有 postgres CLOSEST 运算符?

如何在 psycopg2 中使用服务器端游标

Postgresql - 在 Big Data 库中使用数组的性能

Rails 3:在 Postgres 支持的 ActiveRecord 中使用 json 作为列类型时出现迁移错误

在 PostgreSQL 中表示Sparse稀疏数据

为什么 PostgreSQL 数组访问在 C 中比在 PL/pgSQL 中快得多?

如何确定 NULL 是否包含在 Postgres 的数组中?

Postgres jsonbNOT contains运算符

如何在 postgres 中使用 json_populate_recordset 解析 json

SqlAlchemy:多列的不同计数

null 计算结果为 false 的情况

如何将 CSV 数据插入 PostgreSQL 数据库(远程数据库)