SQLDatabaseで発生するEntityFrameWorkの問題

スポンサーリンク

SQLDatabaseが新Editionになってから下記のエラーをよく見かけるようになりました。

何が原因なのか良くわかっていないのですが接続が切断しているみたいです。

A transport-level error has occurred when receiving results from the server.
(provider: Session Provider, error: 19 - Physical connection is not usable)

気持ち悪いので色々調べてみたのですがどうやら接続文字列に下記の情報を追加する事で現象が収まったという情報を発見しました。

ConnectionLifetime=10;MaxPoolSize=10;

それぞれの設定が何を意味するかはこちらをどうぞ。

かいつまんで理解すると接続時に生成されたプールがライフタイム有効期限を越えてしまい接続できない状態になってしまったという事だと思います。

デフォルトの設定状態、LifeTime(0):MaxPoolSize(100)だとプーラーが生成された接続プールを最大限に利用し続けようとして、限界を迎えた時に強制的に接続を断して上記のエラーを発生させるんだろうなと思うのが1つ目の仮説。

2つめの仮説は断片化したプールがメモリ上に残っていてそいつが悪さをしてパフォーマンスを下げるため発生している可能性があるというもの。

なので明示的にLiftTimeとMaxPoolSizeを指定することでプールのサイクルが適正化されて問題が発生しないんだと思います。

コメント