我们正在 Ubuntu 14.04 上的 Docker 容器中运行 .NET Core 1.1 API。 API 通过 EF Core 与各种 SQL Server 数据库进行交互,我们看到数据库连接没有被清理,也没有被重用。通过 sp_who2 查询,我们很快就看到数据库上有数千个连接。
- 所有连接都是使用相同的连接字符串创建的,因此连接池应该能够工作。
- 连接上的 LastBatch 时间不会更新,因此它们似乎没有被重用,正如您在池化时所期望的那样。
- 调用数据库的对象是使用
Scoped
生命周期定义的,因此应在每次 session 后进行清理。 - 休眠 Rhinos EF Profiler 似乎显示 DbContext 在 EF 内得到一致清理。
- 每次访问数据库时,连接计数都不会增加,因此可能是特定代码 - 我们仍在努力确定这一点。
- 我们的测试表明,在 IIS 或 IIS Express 下的 Windows 上运行时不会发生这种情况,因此它似乎是 Docker 或 Ubuntu 特有的。
这可能是 .NET Core 中设计的吗?还是我们错过了一个技巧?我们如何强制 EF 进行一些连接清理?
最佳答案
我们现在非常确定这是由 corefx System.Data.SqlClient 中的错误引起的,该错误已在版本 4.3.1 中修复。我们运行的是 4.3.0,现在已更新到 4.3.1,初步测试表明问题已解决。
您可以在 dotnet/corefx Github 存储库 Issue #13422 中阅读有关该问题的更多信息。 。
总而言之,这似乎是 Linux 特有的错误,其中连接未被释放。
当我们证明这可以让我满意地解决问题时,我将确认/标记为答案。
关于c# - 如何确保我们的 .NET Core API 清理数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46805130/