我如何确保我们的 .NET Core API 清理数据库连接?

How do I ensure our .NET Core APIs clean up database connections?

我们在 Ubuntu 14.04 上的 Docker 容器中 运行 .NET Core 1.1 APIs。 API 通过 EF Core 与各种 SQL 服务器数据库交互,我们看到的是数据库连接没有被清理,也没有被重用。通过 sp_who2 查询,我们很快就会看到数据库上有数千个连接。

  1. 所有连接都是使用相同的连接字符串创建的,因此连接池应该可以工作。
  2. 连接上的 LastBatch 时间不会更新,因此它们似乎没有被重用,正如您预期的那样,如果它们被合并。
  3. 调用数据库的对象定义了 Scoped 生命周期,因此应在每次会话后清理。
  4. Hibernating Rhinos EF Profiler 似乎显示在 EF 中持续清理 DbContexts。
  5. 每次访问数据库时,连接计数都不会增加,因此它可能是特定代码 - 我们仍在努力确定这一点。
  6. 我们的测试表明,在 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 特定的错误,其中连接未被处理。

当我们证明这解决了我满意的问题时,我将 confirm/mark 作为答案。