2

EntityFramework4.0を使用したWebアプリケーションがあります。残念ながら、大量のユーザーがアプリケーションにアクセスすると、EFがエラーをスローします 。基になるプロバイダーがOpenで失敗しました

以下はコードスニペットです。

//DAL
public IQueryable<EmployeeEntity> GetEmployeeDetail()
{
    DatabaseEntities ent = new DatabaseEntities(this._connectionString);
    IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity
                                           select employee;

    return result;
}

上記のコードはIQuerableを返すことに注意してください。

  1. 上記のパターンに問題があり、例外が発生する可能性がありますか?
  2. Entity Frameworkは、いつ、どのようにdb接続を閉じる/開くか、またどのくらいの期間保持するかを決定しますか?
  3. 上記のエラーはどのようなシナリオで発生しますか?
  4. EFの接続プールの最大数と構成方法を教えてください。
  5. オープンとクローズを明示的に指定する必要がありますか
  6. 上記の問題を解決するための最良の方法は以下のコードですか?

public IQueryable<EmployeeEntity> GetEmployeeDetail()
{
    using (DatabaseEntities ent = new DatabaseEntities(this._connectionString))
    {
        IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity 
                                            select employee;                     
        return result.ToList().AsQuerable();
    }
}
4

1 に答える 1

2

このToList()呼び出しにより、データベースでクエリがすぐに実行されます。これはフィルタリングされていないため、データベース内のすべての従業員が返されます。これにより、おそらくパフォーマンスの問題が発生する可能性があります。

IQueryableただし、直接返すと、結果を取得しようとするまでにコンテキストが破棄されるため、これを削除することはできません。

次のいずれかを実行できます。

  • メソッドが戻ったときにのスコープが終了しないように動作方法を変更し、entを呼び出さずにクエリを返しますToList()IQueryableその後、を呼び出す前に をさらにフィルタリングできますToList()
  • メソッド内で呼び出しToList()ますが、データベースから返される行の数を減らすために、最初にクエリをフィルター/制限します (たとえば、メソッドにいくつかのパラメーターを渡してこれを指定します)。
于 2012-09-25T12:56:02.583 に答える