2017-10-18 5 views
2

Ubuntu 14.04のDockerコンテナで.NET Core 1.1 APIを実行しています。 APIがEFコアを介してさまざまなSQL Serverデータベースとやりとりしているのは、データベース接続がクリーンアップされておらず、再利用されていないということです。 sp_who2クエリを使用して、データベース上の何千もの接続をすばやく確認しています。.NET Core APIがデータベース接続をクリーンアップするにはどうすればよいですか?

  1. すべての接続は同じ接続文字列で作成されるため、接続プールが機能するはずです。
  2. 接続のLastBatch時間は更新されないため、プールされていると予想されるので、再利用されているようには見えません。
  3. データベースを呼び出すオブジェクトは、Scopedライフサイクルで定義されているため、各セッションの後にクリーンアップする必要があります。
  4. Hibernating Rhinos EF Profilerは、DbContextsがEF内で一貫してクリーンアップされていることを示しています。
  5. データベースにアクセスするたびに接続数が増加することはないため、特定のコードである可能性があります。
  6. 私たちのテストによると、IISやIIS Expressの下でWindowsを実行しているときはこれが起こらないので、DockerやUbuntuに固有のようです。

これは.NETコアで設計されていますか?または、私たちはトリックを逃していますか? EFに接続のクリーンアップを強制するにはどうすればよいですか?

+0

これは非常に素晴らしいストーリーですが、コードを表示していないかどうかを知るためにはどうすればよいでしょうか? [mcve]を作成してください。 –

+0

@ ZoharPeled - 一般的に私はこれに同意し努力していますが、この場合は単純に不可能でした。それは再現しにくい可能性のある原因の数が多い問題でした。それを経験していた。あなたがUbuntuで作業している人が多いので、ほとんどの人が「これはうまくいく」と言っていたはずです。 – Peter

+0

非常に良い。あなたの答えをアップアップしました。 –

答えて

3

これは、バージョン4.3.1で修正された、corefx System.Data.SqlClientのバグが原因であると確信しています。私たちは4.3.0を実行していて、4.3.1にアップデートしました。最初のテストでは、問題が解決されたことが示されています。

dotnet/corefx GithubリポジトリIssue #13422でこの問題の詳細を読むことができます。

要約すると、接続が廃棄されていないLinux固有のバグのようです。

これが問題を私の満足のために解決したことが証明されたときに私は答えとして/マークします。

関連する問題