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

时间:2017-10-18 07:45:42

标签: c# sql-server entity-framework .net-core ubuntu-14.04

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

  1. 使用相同的连接字符串创建所有连接,因此连接池应该能够正常工作。
  2. 连接上的LastBatch时间不会更新,因此它们似乎没有被重用,正如您所期望的那样,它们是合并的。
  3. 调用数据库的对象是使用Scoped生命周期定义的,因此应在每次会话后进行清理。
  4. Hibernating Rhinos EF Profiler似乎显示DbContexts在EF内一直被清理。
  5. 每次访问数据库时连接数都不会增加,因此它可能是特定的代码 - 我们仍然试图将其解决。
  6. 我们的测试表明,在IIS或IIS Express下运行Windows时不会发生这种情况,因此它似乎特定于Docker或Ubuntu。
  7. 这可能是.NET Core中的设计吗?或者我们错过了一招?我们怎么能强迫EF做一些连接清理呢?

1 个答案:

答案 0 :(得分:3)

我们现在很确定这是由于版本4.3.1中修复的corefx System.Data.SqlClient中的错误引起的。我们运行4.3.0并且现在已更新到4.3.1,初始测试表明问题已解决。

您可以在dotnet / corefx Github存储库Issue #13422中阅读有关该问题的更多信息。

总之,它似乎是一个特定于Linux的错误,其中没有处理连接。

当我们证明这解决了我满意的问题时,我会确认/标记为答案。