この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 24272|答える: 0

[出典] EFコアの穴:DbContextPoolがデータベース接続プール接続の枯渇を引き起こす

[リンクをコピー]
2019年11月18日 14:41:59に投稿 | | |
DbContextPoolは ASP.NET Core 2.1で導入された新機能で、DbContextインスタンスの作成オーバーヘッドを節約しますが、その中に小さな穴が隠れています。
最近、ASP.NET Coreプロジェクトが一定期間連続稼働していたところ、ログにデータベース接続プールが最大接続数に達したというエラーが現れました。


System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
   at System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
最初はDbContextが正しく廃棄される原因かと思いましたが、コードの中に手がかりは見つかりませんでした。 後で疑う理由はほとんどなく、DbContextPoolだけだったので削除しようとしましたが、エラーは消えました。 確かにDbContextPoolが原因でしたが、多くの人が疑問に思うのは、DbContextPoolは元々DbContextインスタンスの作成にかかるオーバーヘッドを節約するために設計されているのに、どうやってより多くのデータベース接続を消費できるのか、このプロジェクトの負荷が非常に低いのに、どうやって接続プール全体を消費できるのかという点です。
今日の週次会議でこの奇妙な問題について話したのですが、ふと思ったのですが、各DbContextインスタンスはデータベース接続(SqlConnection)を占有し、DbContextPoolが有効でない場合、リクエストが終了すると対応するDbContextインスタンスが破棄され、データベース接続が再び接続プールに戻されるのだと考えました。 DbContextPoolを使用する場合、DbContextは処分されず、リクエスト終了後にDbContextPoolに戻され、DbContextは元のプールに戻されます。つまり、対応するデータベース接続は元の接続プールに戻されません。 DbContextPool内の各DbContextはデータベース接続に対応し、DbContextPoolにDbContextが増えるごとに、データベース接続プールの接続が1つ減ります。 2つのプールのサイズが異なり、DbContextPoolがデータベース接続プールより大きい場合、問題が生じます。DbContextPoolは自身のプールのサイズ(仮定128)に応じて自由にDbContextをプールに埋め込み、接続プールのサイズ(100と仮定)を無視します。そして上記のエラーは101番目のDbContextが満たされたときに発生します。
このプロジェクトはデフォルト設定を使っていますが、デフォルト設定がこの問題を引き起こしますか?

DbContextPoolの実装ソースコードを見ると、ディスカバリープールのデフォルトサイズ制限は128です


SqlConnentionの実装ソースコードを見ると、接続プールのデフォルトサイズ制限は100であることがわかります

デフォルト設定が問題を引き起こしますが、これは小さな落とし穴です。

理由が分かっているので、解決策はシンプルです。DbContextPoolのpoolSizeをデータベース接続プールのMax_Pool_Sizeより小さく設定します





スコア

参加者数1MB+1 貢献する+1 倒れる 理由
ズモリ775 + 1 + 1 穴を踏んで踏みつけ +1

すべての評価を見る





先の:C#はIsAssignableFrom、IsSubclassOfの判定を継承します
次に:MySQL Entity Framework Core 例外回避策
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com