c# - 在 Docker 中使用 EF Core 对 SQLite DB 的每个查询都非常慢,除非有对 OpenConnection 的显式调用

标签 c# entity-framework docker .net-core

我正在本地主机上运行一个简单的 .NET Core 3.1 Web 应用程序。 Web 应用程序在 Docker Linux 容器中运行(我的主机操作系统是 Windows 10)。 Web 应用程序使用的 SQLite 数据库使用 EF Core 连接,几乎是空的,非常小,只有 60Kb,每个表有 20 条或更少的记录,并且存储在主机上并使用以下命令为容器挂载:

--mount type=bind,source='SomeDummyHostPath',target=/mnt/hostFolder
问题是在 DBContext 上执行的每个查询都运行得很慢(读取 2 行大约需要 2 秒)。当我在 Docker 容器之外运行应用程序时,一切运行顺利(意味着相同的查询在 ~1ms 内执行)。
奇怪的是,在调用 dbContext.Database.OpenConnectionAsync() 之后在每次调用 EF 的 DBSet 之前,Docker 容器中的每个查询都会快速运行(几毫秒)。
为什么在这种情况下性能如此糟糕?如果不显式调用 OpenConnectionAsync,有什么方法可以改进它吗?在每次查询之前?

最佳答案

EF Core 3.x 包含一个影响此用例的重大更改,连接提前关闭:

Database connection is now closed if not used anymore before the TransactionScope has been completed


缓解措施:

If the connection needs to remain open explicit call to OpenConnection() will ensure that EF Core doesn't close it prematurely


sqlite 提供程序是 仍然没有使用连接池 :13837 ;
随着EntityFrameworkCore.Sqlite(>3.0)的新版本,有一些关于事务性的新优化,当.db文件打开时会创建新的.WAL文件;再加上缺乏连接池,导致每次请求都会创建和删除 .WAL 文件; Docker 卷/文件映射到 Windows 文件系统变得非常耗时。

关于c# - 在 Docker 中使用 EF Core 对 SQLite DB 的每个查询都非常慢,除非有对 OpenConnection 的显式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626753/

相关文章:

c# - 在 C# 中使用 C++ API

c# - 比较包含相同枚举类型的枚举值的两个对象

c# - 使用字符串列表过滤 Entity Framework

sql-server - 为什么 Entity Framework 忽略我的连接字符串?

docker - Ingress-nginx日志-出现很多奇怪的条目

c# - C# 中的数字格式 - 单独的 int 和小数部分

c# - 为什么 EF 生成带有不必要的空值检查的 SQL 查询?

docker - 如何在 docker 图像中包含声纳扫描仪

Docker Compose 主机名 DNS 查找失败

c# - MongoDB数据建模——索引和PK