2017-10-18 44 views
2

我們在Ubuntu 14.04上的Docker容器中運行.NET Core 1.1 API。 API通過EF Core與各種SQL Server數據庫交互,我們所看到的是數據庫連接沒有被清理,也沒有被重用。我們通過sp_who2查詢快速查看數據庫上的數千個連接。如何確保我們的.NET Core API清理數據庫連接?

  1. 所有連接都使用相同的連接字符串創建,因此連接池應該能夠工作。
  2. 的LastBatch時間上的連接沒有及時更新,所以它們不會出現要被重用,如你所期望,如果他們合併。
  3. 調用數據庫的對象定義爲Scoped生命週期,所以應在每次會話後清理。
  4. 冬眠犀牛EF探查似乎顯示DbContexts被清理一貫內EF。
  5. 的連接數不增加每次數據庫被擊中的時候,所以它可能是特定的代碼 - 我們仍然在試圖敲定下來。
  6. 我們的測試表明,在IIS或IIS快遞在Windows上運行時,這種情況不會發生,所以它似乎是專門針對碼頭工人或Ubuntu。

難道這是由.NET核心設計?或者我們錯過了一個竅門?我們如何強制EF做​​一些連接清理?

+0

嗯,這是一個很不錯的故事,所有的,但我們應該怎麼知道,如果你不告訴我們你的代碼?請創建一個[mcve]。 –

+0

@ZoharPeled - 通常我同意並努力做到這一點,但它是根本不可能在這種情況下 - 這是一個廣泛的一些可能的原因這是不容易重現一個問題,我問,如果其他人經歷過它。從我的答案你會看到,如果我製作了代碼,大多數人都會說「這對我來說很好」,因爲沒有那麼多人在使用Ubuntu。 – Peter

+0

很好。 upvoted你的答案。 –

回答

3

我們現在非常確定這是由4.3.1版固定的corefx System.Data.SqlClient中的錯誤引起的。我們正在運行4.3.0,現在已更新到4.3.1,並且初始測試表明問題已解決。

您可以在dotnet/corefx Github存儲庫Issue #13422中閱讀關於此問題的更多信息。

總之,它似乎是一個Linux特定的錯誤,其中連接沒有被處置。

當我們證明這解決了這個問題讓我滿意時,我會確認/標記爲答案。