1. ホーム
  2. asp.net

[解決済み] Entity Frameworkを "ウォームアップ "するには?どんな時に "冷める "のか?

2022-09-13 01:20:18

質問

いいえ、2番目の質問の答えは、冬ではありません。

前置きです。

最近、Entity Frameworkについていろいろ調べているのですが、ずっと気になっているのが、クエリが温まっていないときのパフォーマンス、いわゆる「コールドクエリ」です。

私は パフォーマンスの考慮事項 の記事を読みました。著者は 暖かい 冷たい のクエリとどう違うのか、私もその存在を知らずに気づきました。ここで、私はまだ半年しか経験がないことをお伝えしておく必要があるかもしれません。

パフォーマンスに関してフレームワークをよりよく理解したい場合、どのようなトピックを追加で調査すればよいのかがわかりました。残念ながら、インターネット上の情報のほとんどは古かったり、主観で膨れ上がっていたりするため、私が 暖かい 寒い のクエリのトピックです。

基本的に、私がこれまでに気づいたことは、再コンパイルする必要がある場合、またはリサイクルが発生する場合はいつでも、最初のクエリが非常に遅くなることです。その後のデータ読み取りは高速です ( 主観的 )、予想どおりです。

私たちは Windows Server 2012、IIS8、および SQL Server 2012 に移行する予定ですが、Junior として私は実際に、他のものより先にそれらをテストする機会を自分で勝ち取りました。最初のリクエストに対して私のアプリケーションを準備するためのウォーミングアップ モジュールが導入されたことを非常にうれしく思っています。しかし、Entity Framework のウォーミングアップをどのように進めたらいいのかわかりません。

私がすでに知っていることは、やる価値があることです。

  • 提案されたように、あらかじめ私のViewsを生成しておく。
  • 最終的にモデルを別のアセンブリに移動する。

常識的に考えて、私が考えていること。 おそらく間違ったアプローチ :

  • アプリケーション開始時にダミーデータを読み込んで、ウォームアップを行い、モデルの生成と検証を行います。 モデルを生成し、検証する。

質問です。

  • 私のEntity Frameworkでいつでも高可用性を持つための最良のアプローチは何でしょうか?
  • Entity Frameworkは、どのような場合に再びquot;cold"されるのでしょうか?(リコンパイル、リサイクル、IIS再起動など)

どのように解決するのですか?

  • Entity Framework でいつでも高可用性を実現するには、どのような方法がありますか?

事前生成されたビューと静的にコンパイルされたクエリのミックスで行くことができます。

静的な コンパイル済みクエリ は、素早く簡単に書くことができ、パフォーマンスを向上させるのに役立つので、良いものです。しかし、EF5では、EFがクエリ自体を自動コンパイルするため、すべてのクエリをコンパイルする必要はありません。唯一の問題は、これらのクエリは、キャッシュが掃引されたときに失われる可能性があるということです。そのため、ごく稀にしか発生しないが高価なクエリについては、コンパイル済みのクエリへの参照を保持する必要がある。これらのクエリを静的なクラスに置くと、最初に要求されたときにコンパイルされます。これはクエリによっては遅すぎるかもしれないので、アプリケーションの起動時にこれらのクエリを強制的にコンパイルしたい場合があります。

ビューを事前に生成することは、あなたが言及したように他の可能性です。特に、コンパイルに非常に時間がかかり、変更されないクエリのために。この方法では、パフォーマンスのオーバーヘッドを実行時間からコンパイル時間に移動させます。また、この方法では遅延も発生しません。しかし、当然ながらこの変更はデータベースにも及ぶので、対処はそう簡単ではありません。コードの方がより柔軟です。

TPT継承を多用しない(EFの一般的なパフォーマンスの問題です)。継承の階層を深くしすぎず、広くしすぎない。いくつかのクラスに固有のわずか2-3のプロパティは、独自の型を必要とするほどではないかもしれませんが、既存の型のオプション(nullable)プロパティとして処理される可能性があります。

単一のコンテキストを長く保持しないこと。各コンテキストインスタンスはそれ自身の第1レベルのキャッシュを持ち、それが大きくなるにつれてパフォーマンスが遅くなります。コンテキストの作成は安価ですが、コンテキストのキャッシュされたエンティティ内の状態管理は高価になる可能性があります。他のキャッシュ(クエリプランとメタデータ)はコンテキスト間で共有され、AppDomainと一緒に死んでしまう。

全体として、コンテキストを頻繁に割り当て、短時間しか使用しないこと、アプリケーションをすばやく開始できること、ほとんど使用しないクエリはコンパイルし、パフォーマンスが重要でよく使用するクエリには事前生成されたビューを提供することを確認する必要があります。

  • Entity Framework は、どのような場合に再び "cold"されるのでしょうか?(再コンパイル、リサイクル、IIS 再起動など)

基本的に、AppDomainを失うたびに。IIS は毎回再起動を実行します。 29 時間 を行うので、インスタンスがあることを保証することはできません。また、しばらく活動がないと、AppDomain もシャットダウンされます。あなたは再び迅速に立ち上がるように試みるべきです。初期化の一部を非同期で行うことができるかもしれません(ただし、マルチスレッドの問題には注意してください)。要求がない時間帯にアプリケーションのダミー ページを呼び出すスケジュール タスクを使用して、AppDomain が死ぬのを防ぐことができますが、いずれはそうなります。

また、設定ファイルを変更したり、アセンブリを変更したりすると、再起動がかかると思います。